为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕田峪4524236 2021-06-15 05:33:11
这是我遇到的问题的示例: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, aa, b...)}当我运行它时,我收到错误too many arguments in call to foo。我想我可以理解为什么会发生这种情况,但我不清楚的是如何绕过它而不必b在开始时使用额外的插槽制作副本aa(我宁愿不这样做,因为此代码会经常运行b并且有点长)。所以我的问题是:我只是做错了吗?如果不是,那么做我想做的事情的最有效方法是什么?(另外,我无法更改 的签名foo)。
查看完整描述

2 回答

?
DIEA

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.


请注意,扩展切片...并不会创建底层数组的副本以用作参数。参数只是变量的别名。换句话说,它真的很有效。


查看完整回答
反对 回复 2021-06-28
?
慕桂英3389331

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...


查看完整回答
反对 回复 2021-06-28
  • 2 回答
  • 0 关注
  • 216 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信