无法将string转换为 interface {}

我写了一些代码,我需要它来捕捉参数,并通过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采取任何arrays? 顺便说一句,我也试图做到这一点:

 var args = []interface{}(flag.Args()) 

但我得到以下错误:

 cannot convert flag.Args() (type []string) to type []interface {} 

有没有“去”的方法来解决这个问题?

这不是一个错误。 fmt.Println()需要[]interface{}types。 这意味着,它必须是一个interface{}值的切片,而不是“任何切片”。 为了转换切片,您需要循环并复制每个元素。

 old := flag.Args() new := make([]interface{}, len(old)) for i, v := range old { new[i] = v } fmt.Println(new...) 

不能使用任何分片的原因是[]string[]interface{}之间的转换需要更改内存布局,并在O(n)时间内发生。 将types转换为interface{}需要O(1)次。 如果他们不需要循环,编译器仍然需要插入它。

如果只是要打印的一部分string,则可以通过join来避免转换并获得完全相同的输出:

 package main import ( "fmt" "flag" "strings" ) func main() { flag.Parse() s := strings.Join(flag.Args(), " ") fmt.Println(s) }