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