2 回答
TA贡献1820条经验 获得超2个赞
在 Go 运行时,可变参数函数的实现就像它在末尾有一个额外的切片参数而不是可变参数。
例如:
func Foo( a int, b ...int )
func FooImpl( a int, b []int )
c := 10
d := 20
//This call
Foo(5, c, d)
// is implemented like this
b := []int{c, d}
FooImpl(5, b)
理论上,Go 可以处理直接指定一些可变参数而其余参数从数组/切片中扩展出来的情况。但是,它不会有效率。
//This call
Foo(5, c, b...)
// would be implemented like this.
v := append([]int{c},b...)
FooImpl(5, v)
你可以看到 Go 会创建一个bany的副本。Go 的精神是尽可能小,但仍然有用。所以像这样的小功能被丢弃了。您可能会为这种语法糖争论不休,因为它比append.
请注意,扩展切片...并不会创建底层数组的副本以用作参数。参数只是变量的别名。换句话说,它真的很有效。
TA贡献2036条经验 获得超8个赞
你可以这样做:
package main
import "fmt"
func foo(a int, b ...int) {
fmt.Println(a,b)
}
func main() {
a := 0
aa := 1
b := []int{2,3,4}
foo(a, append([]int{aa}, b...)...)
}
当期望时b ...int,您需要传递 a[]int...或int's 作为参数。不要不能混合int和[]int...
- 2 回答
- 0 关注
- 216 浏览
添加回答
举报