fmt.Println中的变量变量扩展[重复]

问题描述 投票:1回答:1

这个问题在这里已有答案:

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

然而一个有效但另一个没有。

我在这里错过了什么?

go variadic-functions variadic
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.