Can you declare multiple variables at once in Go?

2019-01-09 08:12发布

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 values will be 80.

4条回答
姐就是有狂的资本
2楼-- · 2019-01-09 08:41

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
查看更多
一纸荒年 Trace。
3楼-- · 2019-01-09 08:47

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);
}
查看更多
甜甜的少女心
4楼-- · 2019-01-09 08:49

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
}
查看更多
男人必须洒脱
5楼-- · 2019-01-09 08:57

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
查看更多
登录 后发表回答