gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:09:49 28 4
gpt4 key购买 nike

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

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。我想我可以理解为什么会发生这种情况,但我不清楚的是如何绕过它而不必在 aa 的开头复制一个带有额外插槽的 b (我不想这样做,因为这段代码会经常运行并且 b 有点长)。

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

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

最佳答案

在 Go 运行时中,可变参数函数是 implemented好像它最后有一个额外的 slice 参数而不是可变参数。

例如:

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 可以处理直接指定一些可变参数而其余的从数组/slice 扩展出来的情况。但是,效率不高。

//This call
Foo(5, c, b...)

// would be implemented like this.
v := append([]int{c},b...)
FooImpl(5, v)

您可以看到 Go 无论如何都会创建 b 的副本。 The ethos of Go is to be as small as possible and yet still useful .像这样的小功能被丢弃了。您可能会为这种语法糖争论不休,因为它可以比 append 的直接方法更有效地实现。

请注意 expanding a slice with ... does not create a copy of the underlying array用作参数。参数只是给变量起别名。换句话说,它真的很有效。

关于Go:可变参数函数和太多参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18946837/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com