Golang解压缩可变参数

问题描述 投票:-2回答:3

如何在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参数是一个可以由...解压缩的切片。

go
3个回答
0
投票

解压缩可变参数


例如,

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

0
投票

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

0
投票

可变参量仅在您传递给可变参函数的切片为可变参量的[[代替]]时才能扩展。因此,您不能在单个可变参数中组合单个参数和扩展切片。当使用扩展时,该函数将自身“可变”切片作为可变参数接收-它的语义糖可能会造成混淆,因为这些调用不等效: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

您可以找到更多详细信息in the spec,尽管他们使用的示例不清楚其中的某些解释,因为他们的示例可变参数函数具有多个参数。 “如果最终参数是可分配的”开头的部分不是在泛泛的“可变参数函数的最终参数”意义上而是在“示例中的函数的最终参数”意义上指“最终参数”。
© www.soinside.com 2019 - 2024. All rights reserved.