Kevin Burke
Kevin Burke

Reputation: 64756

Can you declare multiple variables at once in Go?

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.

Upvotes: 106

Views: 144305

Answers (8)

Amit Kumar
Amit Kumar

Reputation: 1809

long declaration

var varName1, varName2 string = "value","value"

short declaration

varName1,varName2 := "value1","value2"

Upvotes: 4

Oliver
Oliver

Reputation: 29463

Several answers are incorrect: they ignore the fact that the OP is asking whether it is possible to set several variables to the same value in one go (sorry for the pun).

In go, it seems you cannot if a, b, c are variables, ie you will have to set each variable individually:

a, b, c := 80, 80, 80

But if a, b, c are constants, you can:

const (
        a = 80
        b
        c
    )

Upvotes: 7

SaravanaKumar KKB
SaravanaKumar KKB

Reputation: 81

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

Upvotes: 3

hookenz
hookenz

Reputation: 38879

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
)

Upvotes: 23

CppNoob
CppNoob

Reputation: 2390

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
}

Upvotes: 12

VonC
VonC

Reputation: 1323413

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

Upvotes: 18

KANJICODER
KANJICODER

Reputation: 3885

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

Upvotes: 3

Kevin Burke
Kevin Burke

Reputation: 64756

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

Upvotes: 144

Related Questions