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

Golang 解包可变参数

Golang 解包可变参数

Go
繁星淼淼 2022-04-26 15:26:19
如何...在 golang 中解压可变参数:func run(a, b string, list ...int) {}func call(list ...int) {    run(x, y, list...) // use "list..." is not allowed }func main() {    a := []int{1, 2, 3}    call(a...)}为什么这是非法的?正如我所知,list参数是一个切片,可以由....
查看完整描述

3 回答

?
桃花长相依

TA贡献1860条经验 获得超8个赞

解包可变参数


对于你的例子,


package main


import "fmt"


func run(a, b string, list ...int) {

    fmt.Println(list)

    for i, e := range list {

        fmt.Println(i, e)

    }

}


func call(list ...int) {

    fmt.Println(list)

    var x, y string

    run(x, y, list...) // use "list..." is allowed

}


func main() {

    a := []int{1, 2, 3}

    fmt.Println(a)

    call(a...)

}

游乐场: https: //play.golang.org/p/NI0L-nVVUxm


输出:


[1 2 3]

[1 2 3]

[1 2 3]

0 1

1 2

2 3


查看完整回答
反对 回复 2022-04-26
?
LEATH

TA贡献1936条经验 获得超6个赞

只有当您传递给可变参数函数的切片代替可变参数时,可变参数才能被扩展。出于这个原因,您不能在单个可变参数中组合单个参数和扩展切片。当您使用扩展时,该函数接收“扩展”切片本身作为其可变参数 - 它是语义糖,可能会令人困惑,因为这些调用不等效:


foo := []string{"alpha","beta"}

bar(foo...) // bar receives the foo slice as its variadic parameter

bar(foo[0], foo[1]) // bar receives a new slice with these elements copied to it

您可以在规范中找到更多详细信息,尽管他们使用的示例使一些解释不清楚,因为他们的示例可变参数函数具有多个参数。以“如果最终参数是可赋值的”开头的部分指的是“最终参数”,而不是一般的“可变参数函数的最终参数”意义上的,而是特定的“示例中函数的最终参数”意义上的。


查看完整回答
反对 回复 2022-04-26
?
holdtom

TA贡献1805条经验 获得超10个赞

你没有声明变量 x 和 y。创建它们或仅使用引号。 https://play.golang.org/p/gZnMALrM4Uh


package main


import (

    "fmt"

)


func run(a, b string, list ...int) {

fmt.Println(list)

}


func call(list ...int) {

    run("x", "y", list...) // ok

}


func main() {

    a := []int{1, 2, 3}

    call(a...)

}


查看完整回答
反对 回复 2022-04-26
  • 3 回答
  • 0 关注
  • 222 浏览
慕课专栏
更多

添加回答

举报

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