一尘不染

无法将[]字符串转换为[]接口{}

go

我正在编写一些代码,并且我需要它来捕获参数并将它们传递给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 {}

有“解决方案”解决方法吗?


阅读 249

收藏
2020-07-02

共1个答案

一尘不染

这不是错误。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循环,则编译器仍将需要插入它。

2020-07-02