这个问题在这里已有答案:
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])
相同
然而一个有效但另一个没有。
我在这里错过了什么?
[]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