无法将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) }