Можно ли сразу объявить несколько переменных с помощью Golang?
Например, в Python вы можете ввести следующее:
a = b = c = 80
и все значения будут равны 80.
Можно ли сразу объявить несколько переменных с помощью Golang?
Например, в Python вы можете ввести следующее:
a = b = c = 80
и все значения будут равны 80.
Да, вы можете:
var a, b, c string
a = "foo"
fmt.Println(a)
Вы можете сделать что-то подобное для встроенного назначения, но не совсем так:
a, b, c := 80, 80, 80
С точки зрения спецификации языка, это потому, что переменные определены с помощью:
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
Да, вы можете, и это немного больше нюансов, чем кажется.
Для начала вы можете сделать что-то простое:
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
}
Попробуйте это на игровой площадке: 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);
}
Еще один способ сделать это так
var (
a = 12
b = 3
enableFeatureA = false
foo = "bar"
myvar float64
anothervar float64 = 2.4
)
Также работает для const
const (
xconst = 5
boolconst = false
)