一尘不染

无法将 []string 转换为 []interface {}

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 {}

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


阅读 173

收藏
2021-11-29

共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 循环,编译器仍然需要插入它。

2021-11-29