猿问

Go:可变参数函数和太多参数?

这是我遇到的问题的示例:


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, aa, b...)

}

当我运行它时,我收到错误too many arguments in call to foo。我想我可以理解为什么会发生这种情况,但我不清楚的是如何绕过它而不必b在开始时使用额外的插槽制作副本aa(我宁愿不这样做,因为此代码会经常运行b并且有点长)。


所以我的问题是:我只是做错了吗?如果不是,那么做我想做的事情的最有效方法是什么?


(另外,我无法更改 的签名foo)。


慕田峪4524236
浏览 217回答 2
2回答

DIEA

在 Go 运行时,可变参数函数的实现就像它在末尾有一个额外的切片参数而不是可变参数。例如:func Foo( a int, b ...int )func FooImpl( a int, b []int )c := 10d := 20//This callFoo(5, c, d)// is implemented like thisb := []int{c, d}FooImpl(5, b)理论上,Go 可以处理直接指定一些可变参数而其余参数从数组/切片中扩展出来的情况。但是,它不会有效率。//This callFoo(5, c, b...)// would be implemented like this.v := append([]int{c},b...)FooImpl(5, v)你可以看到 Go 会创建一个bany的副本。Go 的精神是尽可能小,但仍然有用。所以像这样的小功能被丢弃了。您可能会为这种语法糖争论不休,因为它比append.请注意,扩展切片...并不会创建底层数组的副本以用作参数。参数只是变量的别名。换句话说,它真的很有效。

慕桂英3389331

你可以这样做:package mainimport "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...
随时随地看视频慕课网APP

相关分类

Go
我要回答