Go arasındaki fark: = ve = operatörler


283

=Ve :=operatörleri arasındaki fark nedir ve onlar için kullanım durumları nelerdir? İkisi de bir görev için mi?


2
Ayrıca, bu bkz : Git Değişkenler Görsel Kılavuzu . Bununla ilgili bir makale yazdım.
İnanç Gümüş

1
Anlambilim ...
JustDave

Belirli bir tür kullanmak istiyorsanız, x := uint32(123)örneğin çalışır. Çoğu insan için açık olmalı ama birkaç dakika düşünmek zorunda kaldım ;-)
Kenji Noguchi

Yanıtlar:


198

Yalnızca =atama operatörüdür.

:=Kısa değişken bildirimleri deyiminin sözdiziminin bir parçasıdır .

Though Yine de bazı kurallar var. Daha fazla ayrıntı için bu diğer cevaba bakınız.


yani çıkartılmış tipte değişken anlamına mı geliyor? sağ?
Krupal Şah

@KrupalShah dokümanı bağlantısı tam anlamıyla diyor ki - "Başlatıcı ifadeleri ile düzenli bir değişken bildirimi için kestirme ancak türleri yok:" golang.org/ref/spec#Short_variable_declarations
akshaynagpal

1
Görünüşe göre :=burada bir operatör olarak golang.org/ref/spec#Operators_and_punctuation olarak listeleniyor , bu yüzden " :=aslında bir operatör değil " kabul ettiğinden emin değilim
Powers

347

Go'da, :=bildirim + atama için kullanılırken, =yalnızca atama içindir.

Örneğin, var foo int = 10 ile aynıdır foo := 10.


4
Bunun =aksine bir kullanım durumu var mı :=? Her zaman :=mı kullanmalısın ?
Kenny Worden

3
@KennethWorden Go, :=aynı anda birden çok değişkene atamadığınız sürece ve daha önce bildirilmiş bir değişkene atamanıza izin vermez ve bu değişkenlerden en az biri yeni değildir.
Kenny Bania

5
intgerekli değildir, var foo = 10aynıfoo := 10
Gary Lyn

@KennyWorden, evet. Şunları kullanamazsınız: = bir fonksiyonun dışında.
Karuhanga

105

Diğerlerinin daha önce açıkladığı gibi, :=hem beyan, atama hem de yeniden beyan içindir; ve (tahmin infers otomatik) değişkenin türünü.

Örneğin, foo := 32kısa süreli bir formudur:

var foo int
foo = 32

// OR:
var foo int = 32

// OR:
var foo = 32

/ * Bazı kurallar var: * /

★ 1. Kural:

Sen kullanamaz :=dışarı funcs. Çünkü herhangi bir işlev dışında, bir deyimin bir anahtar kelimeyle başlaması gerekir.

// 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. Kural:

Bunları iki kez kullanamazsınız ( aynı kapsamda ):

legal := 42
legal := 42 // <-- error

Çünkü, "yeni bir değişken":= tanıtır , bu nedenle onu iki kez kullanmak ikinci bir değişkeni yeniden tanımlamaz, bu yüzden yasadışıdır.


★ 3. Kural:

Bunları çok değişkenli bildirimler ve atamalar için kullanabilirsiniz:

foo, bar   := 42, 314
jazz, bazz := 22, 7

★ 4. Kural (Redeclaration):

Değişkenlerden biri yeni ise , bunları "çok değişkenli" bildirimlerde iki kez kullanabilirsiniz :

foo, bar  := someFunc()
foo, jazz := someFunc()  // <-- jazz is new
baz, foo  := someFunc()  // <-- baz is new

Bu yasaldır, çünkü tüm değişkenleri bildirmezsiniz, sadece mevcut değişkenlere yeni değerler atarsınız ve aynı anda yeni değişkenler bildirirsiniz. Buna yeniden açıklama denir .


★ 5. Kural:

Kısa bildirimi, daha önce aynı adla aynı adla bildirilmiş olsa bile, daha yeni bir kapsamdaki bir değişkeni bildirmek için kullanabilirsiniz:

var foo int = 34

func some() {
  // because foo here is scoped to some func
  foo := 42  // <-- legal
  foo = 314  // <-- legal
}

Burada foo := 42, bu beyan, çünkü yasal olduğu fooiçinde some()fonk kapsamı. foo = 314yasaldır, çünkü yalnızca yeni bir değer atar foo.


★ 6. Kural:

Aynı adı kısa ifade bloklarında şu şekilde bildirebilirsiniz: if , for , switch :

foo := 42
if foo := someFunc(); foo == 314 {
  // foo is scoped to 314 here
  // ...
}
// foo is still 42 here

Çünkü fooiçinde if foo := ..., sadece o aittir ifmaddede ve farklı kapsam içinde.


Bu nedenle, genel bir kural olarak: Bir değişkeni kolayca bildirmek isterseniz :=veya yalnızca varolan bir değişkenin üzerine yazmak istiyorsanız, kullanabilirsiniz =.

Referanslar:


21

:= bir açıklama kısaltmasıdır.

a := 10
b := "gopher"

aBir ilan edilecek intve değerle başlatıldı 10olarak bbir dize olarak ilan ve değerle başlatılır gopher.

Onların eşdeğerleri kullanarak =olacağını

var a = 10
var b = "gopher"

=atama operatörüdür. Başka bir dilde kullandığınız gibi kullanılır.

Değişkeni bildirdiğinizde ve bir başlatıcı mevcut olduğunda türü atlayabilirsiniz ( http://tour.golang.org/#11 ).


«= Atama operatörüdür. Başka bir dilde kullandığınız gibi kullanılır. » Ada hariç =sadece karşılaştırma içindir ve :=görevlendirme içindir ...
Alexis Wilke

13

: =, Bildirmek ve atamak anlamına gelirken, = sadece atamak anlamına gelir.


11

:=beyan eder ve atar, =sadece atar

Kodunuzu tür veya yapı bildirimleriyle doldurmak istemediğinizde kullanışlıdır.

// 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)

7

referans dokümanından: ( tour.golang.org )

Bir fonksiyonun içinde , :=kısa atama ifadesi örtük tipte bir değişken bildirimi yerine kullanılabilir.

Bir işlevin dışında , her yapı bir anahtar kelimeyle başlar (var, func, vb.) Ve: = construct kullanılamaz.



2

Her ikisi de Go dilinde farklı değişken bildirim tekniğidir.

var firstName = "John" // is a variable declaration 

VE

firstName := "John"   // is a short variable declaration. 

Kısa değişken bildirimi, başlatıcı ifadeleri olan, ancak türü olmayan düzenli bir değişken bildirimi için bir kısayoldur.

Ayrıntılar için aşağıdakileri okuyun:

Değişken bildirimleri

Kısa değişken bildirimleri


10
İlk örnekte sözdiziminizin yanlış olduğunu düşünüyorum. Bunun yerine: var firstName: = "John" şöyle olmalıdır: var firstName = "John"
Gino
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.