首页 > 解决方案 > fmt.Println 中的可变变量展开

问题描述

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

然而一个工作,但另一个没有。

我在这里想念什么?

标签: govariadic-functionsvariadic

解决方案


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


推荐阅读