Can you declare multiple variables at once in Go?

前提是你 提交于 2019-11-27 08:48:27

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
VonC

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

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
}

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

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
)
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!