我正在编写一些代码,我需要它来捕获参数并将它们传递给 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
不应该采用 any 数组吗?顺便说一句,我也尝试过这样做:
var args = []interface{}(flag.Args())
但我收到以下错误:
cannot convert flag.Args() (type []string) to type []interface {}
是否有解决此问题的“Go”方式?
最佳答案
这不是错误。 fmt.Println()
需要 []interface{}
类型。这意味着,它必须是 interface{}
值的 slice ,而不是“任何 slice ”。为了转换 slice ,您需要循环并复制每个元素。
old := flag.Args()
new := make([]interface{}, len(old))
for i, v := range old {
new[i] = v
}
fmt.Println(new...)
您不能使用任何 slice 的原因是 []string
和 []interface{}
之间的转换需要更改内存布局并发生在 O(n) 时间内。将类型转换为 interface{}
需要 O(1) 时间。如果他们不需要这个 for 循环,编译器仍然需要插入它。
关于type-conversion - 无法将 [] 字符串转换为 [] 接口(interface) {},我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12990338/