3 回答
TA贡献1860条经验 获得超8个赞
解包可变参数
对于你的例子,
package main
import "fmt"
func run(a, b string, list ...int) {
fmt.Println(list)
for i, e := range list {
fmt.Println(i, e)
}
}
func call(list ...int) {
fmt.Println(list)
var x, y string
run(x, y, list...) // use "list..." is allowed
}
func main() {
a := []int{1, 2, 3}
fmt.Println(a)
call(a...)
}
游乐场: https: //play.golang.org/p/NI0L-nVVUxm
输出:
[1 2 3]
[1 2 3]
[1 2 3]
0 1
1 2
2 3
TA贡献1936条经验 获得超6个赞
只有当您传递给可变参数函数的切片代替可变参数时,可变参数才能被扩展。出于这个原因,您不能在单个可变参数中组合单个参数和扩展切片。当您使用扩展时,该函数接收“扩展”切片本身作为其可变参数 - 它是语义糖,可能会令人困惑,因为这些调用不等效:
foo := []string{"alpha","beta"}
bar(foo...) // bar receives the foo slice as its variadic parameter
bar(foo[0], foo[1]) // bar receives a new slice with these elements copied to it
您可以在规范中找到更多详细信息,尽管他们使用的示例使一些解释不清楚,因为他们的示例可变参数函数具有多个参数。以“如果最终参数是可赋值的”开头的部分指的是“最终参数”,而不是一般的“可变参数函数的最终参数”意义上的,而是特定的“示例中函数的最终参数”意义上的。
TA贡献1805条经验 获得超10个赞
你没有声明变量 x 和 y。创建它们或仅使用引号。 https://play.golang.org/p/gZnMALrM4Uh
package main
import (
"fmt"
)
func run(a, b string, list ...int) {
fmt.Println(list)
}
func call(list ...int) {
run("x", "y", list...) // ok
}
func main() {
a := []int{1, 2, 3}
call(a...)
}
- 3 回答
- 0 关注
- 222 浏览
添加回答
举报