У чому різниця між =
і :=
операторами, і які варіанти використання для них? Вони обидва здаються на завдання?
x := uint32(123)
працює. Для більшості людей це повинно бути очевидним, але мені довелося подумати кілька хвилин ;-)
У чому різниця між =
і :=
операторами, і які варіанти використання для них? Вони обидва здаються на завдання?
x := uint32(123)
працює. Для більшості людей це повинно бути очевидним, але мені довелося подумати кілька хвилин ;-)
Відповіді:
Тільки =
оператор присвоєння.
:=
є частиною синтаксису пропозиції коротких змінних оголошень .
👉 Однак є деякі правила. Дивіться цю іншу відповідь для отримання більш детальної інформації.
:=
, зазначений тут як оператор golang.org/ref/spec#Operators_and_punctuation , тож я не впевнений, що згоден, що " :=
насправді не оператор"
У програмі Go :=
- призначено для оголошення + призначення, тоді =
як призначене лише для призначення.
Наприклад, var foo int = 10
те саме, що foo := 10
.
=
відміну від :=
? Чи варто завжди використовувати :=
?
:=
призначити змінну, яка вже була оголошена, якщо ви не призначите відразу кілька змінних, і принаймні одна з цих змінних є новою.
int
не потрібно, var foo = 10
так само , якfoo := 10
Як уже пояснили інші, :=
це як для декларації, привласнення, так і для передекларації; і він автоматично відгадує ( виводить ) тип змінної.
Наприклад, foo := 32
це форма короткої руки:
var foo int
foo = 32
// OR:
var foo int = 32
// OR:
var foo = 32
/ * Є деякі правила: * /
★ 1-е правило:
Ви не можете використовувати :=
зfuncs
. Це тому, що з будь-якого функціоналу оператор повинен починатися з ключового слова.
// no keywords below, illegal.
illegal := 42
// `var` keyword makes this statement legal.
var legal = 42
func foo() {
alsoLegal := 42
// reason: it's in a func scope.
}
★ 2-е правило:
Ви не можете їх використовувати двічі ( в тому ж обсязі ):
legal := 42
legal := 42 // <-- error
Тому що, :=
вводячи "нову змінну" , отже, використання її двічі не переосмислює другу змінну, тому це незаконно.
★ 3-е правило:
Ви можете використовувати їх для декларацій та призначень з різними змінними:
foo, bar := 42, 314
jazz, bazz := 22, 7
★ 4-е правило (передекларація):
Ви можете використовувати їх двічі у "багато змінних" оголошеннях, якщо одна із змінних нова :
foo, bar := someFunc()
foo, jazz := someFunc() // <-- jazz is new
baz, foo := someFunc() // <-- baz is new
Це законно, адже ви не декларуєте всі змінні, ви просто перепризначаєте нові значення існуючим змінним і одночасно декларуєте нові змінні. Це називається передекларацією .
★ 5 правило:
Ви можете використовувати коротку декларацію, щоб оголосити змінну в більш новій області, навіть якщо ця змінна вже була оголошена тим самим ім'ям:
var foo int = 34
func some() {
// because foo here is scoped to some func
foo := 42 // <-- legal
foo = 314 // <-- legal
}
Ось, foo := 42
це законно, тому що, він заявляє foo
в області some()
функцій. foo = 314
є законним, оскільки він просто присвоює нове значення foo
.
★ 6 правило:
Ви можете оголосити те саме ім'я в блоках коротких висловлювань, як: if , for , switch :
foo := 42
if foo := someFunc(); foo == 314 {
// foo is scoped to 314 here
// ...
}
// foo is still 42 here
Тому що, foo
в if foo := ...
, належить лише до цього if
пункту, і це в іншому обсязі.
Отже, як загальне правило: якщо ви хочете легко оголосити змінну, яку ви можете використовувати
:=
, або, якщо ви хочете лише перезаписати існуючу змінну, ви можете використовувати=
.
Список літератури:
:=
є короткою рукою для декларації.
a := 10
b := "gopher"
a
буде оголошено як int
і ініціалізовано зі значенням, 10
де як b
буде оголошено як рядок та ініціалізовано зі значеннямgopher
.
Їх еквіваленти з використанням =
будуть
var a = 10
var b = "gopher"
=
є оператором присвоєння. Він використовується так само, як і в будь-якій іншій мові.
Ви можете опустити тип при оголошенні змінної та присутні ініціалізатор ( http://tour.golang.org/#11 ).
=
тільки для порівняння і :=
призначено для завдання ...
: = Означає оголосити і призначити, тоді як = означає просто призначити.
:=
заявляє і призначає, =
просто призначає
Це корисно, коли ви не хочете заповнювати свій код деклараціями типу або структури.
// Usage with =
var i int
var U, V, W float64
var k = 0
var x, y float32 = -1, -2
// Usage with :=
i, j := 0, 10
f := func() int { return 7 }
ch := make(chan int)
від довідкового документа: ( tour.golang.org )
Усередині функції , то:=
оператор короткого призначення може бути використаний замість вару декларації з неявним типом.
Поза межами функції кожна конструкція починається з ключового слова (var, func тощо), і: = конструкція недоступна.
": =" Використовувати для одночасного оголошення та ініціалізації, наступний приклад.
Використання "="
var i int
i = 10
https://play.golang.org/p/RU88ty_SGa
Використання ": ="
i: = 10
Обидва є різною технікою змінного оголошення в мові Go.
var firstName = "John" // is a variable declaration
І
firstName := "John" // is a short variable declaration.
Коротке оголошення змінної - це скорочення для звичайного оголошення змінної з виразами ініціалізатора, але без типів.
Детальніше читайте нижче: