go - 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])
然而一个工作,但另一个没有。
我在这里想念什么?
解决方案
[]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
推荐阅读
- java - 将公共方法转换为私有方法
- python - peewee 表的有效插入权限
- java - IST(印度标准时间)的 LocalDateTime 与 ZoneOffset 以更清洁的方式
- google-maps - “未处理的异常:NoSuchMethodError:在 null 上调用了 getter 'iterator'。” 当我在颤振中使用 google_maps_polyline 插件时抛出
- java - How can I make my robot turn 90 degree to the right?
- c++ - 如何避免在 cmake 中自动链接 Qt5 库?
- docker - Why portainer can not run successfully in docker of windows server 2016?
- php - 在函数内部调用函数时出错
- python - 使用 Pandas pd.DateOffset 查找随机日期前一个月的第一天
- php - PHP:“没有这样的文件或目录”但文件存在