我正在编写一些代码,我需要它来捕获参数并传递它们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 {}
有没有“Go”方法来解决这个问题?
这不是错误。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 循环,编译器仍然需要插入它。