登录
首页 >  Golang >  Go问答

在可变参数函数中混合“爆炸”切​​片和常规参数

来源:Golang技术栈

时间:2023-03-22 12:14:57 122浏览 收藏

亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《在可变参数函数中混合“爆炸”切​​片和常规参数》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下golang,希望所有认真读完的童鞋们,都有实质性的提高。

问题内容

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

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

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

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

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

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

正确答案

可以 通过枚举元素 使用现有切片来指定可变参数的值,该切片由其名称后跟....

您想混合 Go 语言规范(将参数传递给...参数)不允许的 2 种可能方式。

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

[作为可变参数] 传递的值是一个新的类型切片,[]T具有一个新的底层数组,其连续元素是实际参数。

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

too many arguments in call to foo

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

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

理论要掌握,实操不能落!以上关于《在可变参数函数中混合“爆炸”切​​片和常规参数》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表