Подтвердить что ты не робот

Можете ли вы объявить сразу несколько переменных в Go?

Можно ли сразу объявить несколько переменных с помощью Golang?

Например, в Python вы можете ввести следующее:

a = b = c = 80

и все значения будут равны 80.

4b9b3361

Ответ 1

Да, вы можете:

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

Вы можете сделать что-то подобное для встроенного назначения, но не совсем так:

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

Ответ 2

С точки зрения спецификации языка, это потому, что переменные определены с помощью:

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

(Из " Объявление переменной ")

Список идентификаторов для одного типа, назначенный одному выражению или 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

Ответ 3

Да, вы можете, и это немного больше нюансов, чем кажется.

Для начала вы можете сделать что-то простое:

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'

Часто встречающаяся картина в Голанге:

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
}

Таким образом, вы можете назначать уже определенные переменные в левой части оператора :=, если хотя бы одна из переменных, для которых назначается, является новой. В противном случае это не правильно сформировано. Это удобно, поскольку позволяет повторно использовать одну и ту же переменную ошибки для нескольких вызовов 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
}

Ответ 4

Попробуйте это на игровой площадке: 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);
}

Ответ 5

Еще один способ сделать это так

var (
   a = 12
   b = 3
   enableFeatureA = false

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

Также работает для const

const (
  xconst    = 5
  boolconst = false
)