无法将 [] 字符串转换为 [] 接口 {} [英] Cannot convert []string to []interface {}
问题描述
我正在编写一些代码,我需要它来捕获参数并将它们传递给 fmt.Println
(我想要它的默认行为,编写由空格分隔并后跟换行符的参数).但是它需要 []interface {}
但 flag.Args()
返回一个 []string
.
下面是代码示例:
I'm writing some code, and I need it to catch the arguments and pass them through fmt.Println
(I want its default behaviour, to write arguments separated by spaces and followed by a newline). However it takes []interface {}
but flag.Args()
returns a []string
.
Here's the code example:
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 数组吗?顺便说一句,我也尝试过这样做:
Is this a bug? Shouldn't fmt.Println
take any array? By the way, I've also tried to do this:
var args = []interface{}(flag.Args())
但我收到以下错误:
cannot convert flag.Args() (type []string) to type []interface {}
是否有解决此问题的Go"方式?
Is there a "Go" way to workaround this?
推荐答案
这不是错误.fmt.Println()
需要 []interface{}
类型.这意味着,它必须是 interface{}
值的切片,而不是任何切片".为了转换切片,您需要循环并复制每个元素.
This is not a bug. fmt.Println()
requires a []interface{}
type. That means, it must be a slice of interface{}
values and not "any slice". In order to convert the slice, you will need to loop over and copy each element.
old := flag.Args()
new := make([]interface{}, len(old))
for i, v := range old {
new[i] = v
}
fmt.Println(new...)
您不能使用任何切片的原因是 []string
和 []interface{}
之间的转换需要更改内存布局并发生在 O(n) 时间内.将类型转换为 interface{}
需要 O(1) 时间.如果他们不需要这个 for 循环,编译器仍然需要插入它.
The reason you can't use any slice is that conversion between a []string
and a []interface{}
requires the memory layout to be changed and happens in O(n) time. Converting a type to an interface{}
requires O(1) time. If they made this for loop unnecessary, the compiler would still need to insert it.
这篇关于无法将 [] 字符串转换为 [] 接口 {}的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!