Can you declare multiple variables at once in Go?

前端 未结 6 1136
鱼传尺愫
鱼传尺愫 2020-12-01 15:36

Is it possible to declare multiple variables at once using Golang?

For example in Python you can type this:

a = b = c = 80

and all

相关标签:
6条回答
  • 2020-12-01 15:57

    In terms of language specification, this is because the variables are defined with:

    VarDecl     = "var" ( VarSpec | "(" { VarSpec ";" } ")" ) .
    VarSpec     = IdentifierList ( Type [ "=" ExpressionList ] | "=" ExpressionList ) .
    

    (From "Variable declaration")

    A list of identifiers for one type, assigned to one expression or ExpressionList.

    const a, b, c = 3, 4, "foo"  // a = 3, b = 4, c = "foo", untyped integer and string constants
    const u, v float32 = 0, 3    // u = 0.0, v = 3.0
    
    0 讨论(0)
  • 2020-12-01 16:07

    Another way of doing is using var for package level assignment

    package main
    
    import (
        "fmt"
    )
    
    var (
        a, b, c = 80, 80 ,80
    )
    
    func main() {
        fmt.Println(a, b, c)
    }
    
    0 讨论(0)
  • 2020-12-01 16:08

    Another way to do this is like this

    var (
       a = 12
       b = 3
       enableFeatureA = false
    
       foo = "bar"
       myvar float64
       anothervar float64 = 2.4
    )
    

    Also works for const

    const (
      xconst    = 5
      boolconst = false
    )
    
    0 讨论(0)
  • 2020-12-01 16:13

    Try this in the go-playground: https://play.golang.org/

    package main
    
    import "fmt"
    
    func main() {
        a, b := "a", "b"; //Declare And Assign
        var c, d string;  //Declare Only
        fmt.Println(a,b);
        fmt.Println(c,d);
    }
    
    0 讨论(0)
  • 2020-12-01 16:16

    Yes you can and it is slightly more nuanced than it seems.

    To start with, you can do something as plain as:

    var a, b, x, y int  // declares four variables all of type int
    

    You can use the same syntax in function parameter declarations:

    func foo(a, b string) {  // takes two string parameters a and b
        ...
    }
    

    Then comes the short-hand syntax for declaring and assigning a variable at the same time.

    x, y := "Hello", 10   // x is an instance of `string`, y is of type `int`
    

    An oft-encountered pattern in Golang is:

    result, err := some_api(...)  // declares and sets `result` and `err`
    if err != nil {
        // ...
        return err
    }
    
    result1, err := some_other_api(...)   // declares and sets `result1`, reassigns `err`
    if err != nil {
        return err
    }
    

    So you can assign to already-defined variables on the left side of the := operator, so long as at least one of the variables being assigned to is new. Otherwise it's not well-formed. This is nifty because it allows us to reuse the same error variable for multiple API calls, instead of having to define a new one for each API call. But guard against inadvertent use of the following:

    result, err := some_api(...)  // declares and sets `result` and `err`
    if err != nil {
        // ...
        return err
    }
    
    if result1, err := some_other_api(...); err != nil {   // result1, err are both created afresh, 
                                                           // visible only in the scope of this block.
                                                           // this err shadows err from outer block
        return err
    }
    
    0 讨论(0)
  • 2020-12-01 16:22

    Yes, you can:

    var a, b, c string
    a = "foo"
    fmt.Println(a)
    

    You can do something sort of similar for inline assignment, but not quite as convenient:

    a, b, c := 80, 80, 80
    
    0 讨论(0)
提交回复
热议问题