关于go:fmt.Println中的Variadic变量扩展

Variadic Variable Expansion in fmt.Println

本问题已经有最佳答案,请猛点这里访问。
1
2
3
4
5
6
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

1
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])相当于

1
fmt.Println([]interface{}{a[0], a[1], a[2]}...)

相当于

1
2
3
4
5
fmt.Println([]interface{}{
    interface{}(a[0]),
    interface{}(a[1]),
    interface{}(a[2]),
}...)

因此,当您传递a[0]a[1]a[2]时,将创建隐式interface{}值,该值将隐式包装在一个切片中。

如果要将EDOCX1的元素(13)传递给期望[]interface{}的可变参数的函数,则必须事先"手动"创建该切片,例如:

1
2
3
4
5
b := make([]interface{}, len(a))
for i, v := range a {
    b[i] = v
}
fmt.Println(b...)

在游乐场上试试这些例子。

另请参见相关问题:解包切片