web-dev-qa-db-ja.com

Goで複数の変数を一度に宣言できますか?

Golangを使用して複数の変数を一度に宣言することは可能ですか?

たとえば、Pythonでは、次のように入力できます。

a = b = c = 80

すべての値は80になります。

48
Kevin Burke

はい、できます:

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

インライン割り当てでも同様のことができますが、それほど便利ではありません。

a, b, c := 80, 80, 80
67
Kevin Burke

言語仕様に関しては、変数が次のもので定義されているためです。

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

(「 変数宣言 」から)

expression または ExpressionList に割り当てられた、1つのタイプの識別子のリスト。

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
11
VonC

はい、できます。見た目よりも少し微妙です。

はじめに、次のような単純なことができます。

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

関数のパラメーター宣言で同じ構文を使用できます。

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

次に、変数の宣言と割り当てを同時に行うための短縮構文があります。

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

Golangでよく遭遇するパターンは次のとおりです。

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
}

したがって、割り当てられている変数の少なくとも1つが新しい限り、:=演算子の左側で定義済みの変数に割り当てることができます。それ以外の場合、整形式ではありません。 API呼び出しごとに新しいエラー変数を定義する代わりに、複数のAPI呼び出しに同じエラー変数を再利用できるため、これは素晴らしいです。ただし、次のものを誤って使用しないように注意してください。

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
}
6
CppNoob

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);
}
2
J.M.I. MADISON

これを行う別の方法はこのようなものです

var (
   a = 12
   b = 3
   enableFeatureA = false

   foo = "bar"
   myvar float64
   anothervar float64 = 2.4
)

Constでも機能します

const (
  xconst    = 5
  boolconst = false
)
0
Matt