gpt4 book ai didi

go - 在可变参数函数中混合 "exploded" slice 和常规参数

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

我想知道为什么不能在 go 中执行以下操作:

func main() {
stuff := []string{"baz", "bla"}
foo("bar", stuff...)
}

func foo(s ...string) {
fmt.Println(s)
}

在我的理解中, slice ...“分解” slice ,因此它可以用于多参数函数调用。所以上面的例子实际上应该扩展为 foo("bar", "baz", "bla")

foo(stuff...) 按预期工作,这并不奇怪,但在上面的示例中,编译器提示参数太多。

这是一个期望的限制吗?我来自 ruby 背景,其中 foo("bar", *stuff) 非常好(至少在我的书中,同样的事情),这就是为什么这让我感到惊讶。

最佳答案

可变参数的值可以通过枚举元素或者来指定,或者使用现有的 slice ,通过其名称后跟来指定... .

您想混合使用 Go 语言规范 (Passing arguments to ... parameters) 不允许的 2 种可能方式。

如果使用第一种形式(枚举元素):

The value passed [as the variadic parameter] is a new slice of type []T with a new underlying array whose successive elements are the actual arguments.

如果使用后者(传递一个现有 slice ,后跟 ...)不创建新 slice ,则按原样使用您传递的 slice 。而传入的 slice 只能用于指定one的值——final——可变参数。尝试同时传递单个元素 slice 将与函数的签名(在本例中为参数列表)不匹配,您将收到错误消息:

too many arguments in call to foo

Go 中没有实际的“爆炸”,该术语仅在其他语言中用于帮助可视化传递的数组或 slice 将不是可变参数的 元素,而是可变参数的值本身

混合 2 需要分配一个新 slice ,因为显然无法使用现有 slice 。

关于go - 在可变参数函数中混合 "exploded" slice 和常规参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28625546/

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