代码之家  ›  专栏  ›  技术社区  ›  vinllen

Golang解压变量参数

go
  •  0
  • vinllen  · 技术社区  · 6 年前

    如何通过 ...

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

    1 回复  |  直到 6 年前
        1
  •  1
  •   peterSO    6 年前

    解压变量参数


    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
    
        2
  •  0
  •   Adrian    6 年前

    只有当传递给Variadic函数的切片是 多变的论点。因此,不能将单个参数和展开的切片合并到一个变量参数中。当您使用扩展时,函数接收“expanded”切片本身作为其可变参数-语义糖可能会令人困惑,因为这些调用是不等价的:

    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

        3
  •  0
  •   echmel    6 年前

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