fmt.Println中的等角变量展开

时间:2019-04-06 12:03:29

标签: go variadic-functions variadic

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])

但是一个有效,而另一个无效。

我在这里想念什么?

1 个答案:

答案 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