web-dev-qa-db-fra.com

Pouvez-vous déclarer plusieurs variables à la fois dans Go?

Est-il possible de déclarer plusieurs variables à la fois en utilisant Golang?

Par exemple, dans Python vous pouvez taper ceci:

a = b = c = 80

et toutes les valeurs seront 80.

48
Kevin Burke

Oui, vous pouvez:

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

Vous pouvez faire quelque chose de similaire pour une affectation en ligne, mais pas aussi pratique:

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

En termes de spécification de langage, cela est dû au fait que les variables sont définies avec:

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

(De " Déclaration de variable ")

Liste d'identifiants pour un type, affectés à un expression ou 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
11
VonC

Oui, vous le pouvez et c'est légèrement plus nuancé qu'il n'y paraît.

Pour commencer, vous pouvez faire quelque chose d'aussi simple que:

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

Vous pouvez utiliser la même syntaxe dans les déclarations de paramètres de fonction:

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

Vient ensuite la syntaxe abrégée pour déclarer et affecter une variable en même temps.

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

Un modèle souvent rencontré à Golang est:

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
}

Ainsi, vous pouvez affecter des variables déjà définies sur le côté gauche du := opérateur, tant qu’au moins une des variables affectées est nouvelle. Sinon, ce n'est pas bien formé. C'est pratique car cela nous permet de réutiliser la même variable d'erreur pour plusieurs appels d'API, au lieu d'avoir à en définir une nouvelle pour chaque appel d'API. Mais veillez à ne pas utiliser par inadvertance les éléments suivants:

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

Essayez ceci sur le terrain de jeu: 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

Une autre façon de faire est comme ça

var (
   a = 12
   b = 3
   enableFeatureA = false

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

Travaille également pour const

const (
  xconst    = 5
  boolconst = false
)
0
Matt