我正在编写一些代码,并且我需要它来捕获参数并将它们传递给fmt.Println 我(我想要它的默认行为,编写由空格分隔并后跟换行符的参数)。但是它需要[]interface {}而flag.Args()返回[]string。 这是代码示例:
fmt.Println
[]interface {}
flag.Args()
[]string
package main import ( "fmt" "flag" ) func main() { flag.Parse() fmt.Println(flag.Args()...) }
这将返回以下错误:
./example.go:10: cannot use args (type []string) as type []interface {} in function argument
这是一个错误吗?不应该fmt.Println接受 任何 数组吗?顺便说一句,我也尝试这样做:
var args = []interface{}(flag.Args())
但出现以下错误:
cannot convert flag.Args() (type []string) to type []interface {}
有“解决方案”解决方法吗?
这不是错误。fmt.Println()需要一个[]interface{}类型。这意味着它必须是interface{}值的切片,而不是“任何切片”。为了转换切片,您将需要循环并复制每个元素。
fmt.Println()
[]interface{}
interface{}
old := flag.Args() new := make([]interface{}, len(old)) for i, v := range old { new[i] = v } fmt.Println(new...)
您无法使用任何分片的原因是,a []string和a 之间的转换[]interface{}需要更改内存布局,并且发生时间为O(n)。将类型转换为interface{}需要O(1)时间。如果他们不需要此for循环,则编译器仍将需要插入它。