package main
import "fmt"
func main(){
a := []int{1,2,3}
fmt.Println(a...)
}
运行此命令会出现以下错误
./program.go:5: cannot use a (type []int) as type []interface {} in argument to fmt.Println
来自godoc fmt Println
func Println(a ...interface{}) (n int, err error)
Println
接受任何值,因为它是一个空接口。
令我困惑的是
fmt.Println(a...)
与fmt.Println(a[0],a[1],a[2])
但是一个有效,而另一个无效。
我在这里想念什么?
答案 0 :(得分:2)
[]int
与[]interface{}
不同,因此,如果您有[]int
,则不能将其作为可变参数切片的值传递给fmt.Println()
。您可以原样传递它,但这将是一个[]interface{}
切片,而单个值为[]int
切片。
fmt.Println(a...)
与fmt.Println(a[0],a[1],a[2])
不同。
fmt.Println(a[0], a[1], a[2])
等同于
fmt.Println([]interface{}{a[0], a[1], a[2]}...)
等效于
fmt.Println([]interface{}{
interface{}(a[0]),
interface{}(a[1]),
interface{}(a[2]),
}...)
因此,当您传递a[0]
,a[1]
和a[2]
时,将创建隐式interface{}
值,这些值将隐式包装在切片中。
如果您想将a
的元素传递给期望[]interface{}
可变参数的函数,则必须“手动”预先创建该切片,例如:
b := make([]interface{}, len(a))
for i, v := range a {
b[i] = v
}
fmt.Println(b...)
在Go Playground上尝试这些示例。
另请参阅相关问题:Unpacking slice of slices