Perbedaan antara: = dan = operator di Go


283

Apa perbedaan antara operator =dan :=operator, dan apa kasus penggunaan untuk mereka? Mereka berdua sepertinya untuk tugas?


2
Lihat juga ini : Panduan Visual Variabel Go . Saya menulis artikel tentang itu.
Inanc Gumus

1
Semantiknya ...
JustDave

Jika Anda ingin menggunakan jenis x := uint32(123)karya tertentu misalnya. Pasti jelas bagi kebanyakan orang, tetapi saya harus berpikir beberapa menit ;-)
Kenji Noguchi

Jawaban:


198

Hanya =operator penugasan.

:=adalah bagian dari sintaks klausa deklarasi variabel pendek .

πŸ‘‰ Namun ada beberapa aturan. Lihat jawaban lain ini untuk lebih jelasnya.


jadi apakah itu berarti variabel dengan tipe yang disimpulkan? Baik?
Krupal Shah

@KrupalShah tautan ke dokumen secara harfiah mengatakan bahwa - "Ini adalah singkatan untuk deklarasi variabel reguler dengan ekspresi penginisialisasi tetapi tanpa tipe:" golang.org/ref/spec#Short_variable_declarations
akshaynagpal

1
Sepertinya :=terdaftar sebagai operator di sini golang.org/ref/spec#Operators_and_punctuation , jadi saya tidak yakin saya setuju bahwa " :=sebenarnya bukan operator"
Powers

347

In Go, :=untuk deklarasi + penugasan, sedangkan =untuk penugasan saja.

Misalnya, var foo int = 10 sama dengan foo := 10.


4
Apakah ada use case untuk =sebagai lawan :=? Haruskah Anda selalu menggunakan :=?
Kenny Worden

3
@KennethWorden Go tidak akan membiarkan Anda menggunakan :=untuk menetapkan ke variabel yang telah dideklarasikan, kecuali Anda menugaskan ke beberapa variabel sekaligus, dan setidaknya salah satu dari variabel tersebut adalah baru.
Kenny Bania

5
yang inttidak diperlukan, var foo = 10adalah sama denganfoo := 10
Gary Lyn

@ KennyWorden, ya. Anda tidak dapat menggunakan: = di luar fungsi.
Karuhanga

106

Seperti yang sudah dijelaskan orang lain, :=adalah untuk deklarasi, penugasan, dan juga untuk deklarasi ulang; dan itu menebak ( menyimpulkan ) tipe variabel secara otomatis.

Sebagai contoh, foo := 32adalah bentuk tulisan tangan dari:

var foo int
foo = 32

// OR:
var foo int = 32

// OR:
var foo = 32

/ * Ada beberapa aturan: * /

β˜… Aturan 1:

Anda tidak dapat menggunakan :=dari funcs. Itu karena, di luar fungsi apa pun, pernyataan harus dimulai dengan kata kunci.

// 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.
}

β˜… Aturan Kedua:

Anda tidak dapat menggunakannya dua kali ( dalam cakupan yang sama ):

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

Karena, :=memperkenalkan "variabel baru" , maka menggunakannya dua kali tidak mendeklarasikan ulang variabel kedua, jadi itu ilegal.


β˜… Aturan ke-3:

Anda dapat menggunakannya untuk deklarasi dan penugasan multi-variabel:

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

β˜… Aturan ke-4 (Deklarasi Ulang):

Anda dapat menggunakannya dua kali dalam deklarasi "multi-variabel" , jika salah satu variabel baru :

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

Ini legal, karena, Anda tidak mendeklarasikan semua variabel, Anda hanya menugaskan kembali nilai-nilai baru ke variabel yang ada, dan mendeklarasikan variabel baru secara bersamaan. Ini disebut deklarasi ulang .


β˜… Aturan ke-5:

Anda dapat menggunakan deklarasi singkat untuk mendeklarasikan variabel dalam cakupan yang lebih baru bahkan variabel itu sudah dideklarasikan dengan nama yang sama sebelumnya:

var foo int = 34

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

Di sini, foo := 42adalah legal, karena, ia menyatakan foodalam some()lingkup func. foo = 314legal, karena, itu hanya memberikan nilai baru foo.


β˜… Aturan 6:

Anda dapat mendeklarasikan nama yang sama di blok pernyataan pendek seperti: jika , untuk , beralih :

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

Karena, foodalam if foo := ..., hanya milik ifklausa itu dan itu dalam lingkup yang berbeda.


Jadi, sebagai aturan umum: Jika Anda ingin dengan mudah mendeklarasikan variabel yang dapat Anda gunakan :=, atau, jika Anda hanya ingin menimpa variabel yang ada, Anda dapat menggunakan =.

Referensi:


21

:= adalah kependekan dari deklarasi.

a := 10
b := "gopher"

aakan dinyatakan sebagai intdan diinisialisasi dengan nilai di 10mana sebagaimana bakan dinyatakan sebagai string dan diinisialisasi dengan nilai gopher.

Penggunaan setara mereka =akan

var a = 10
var b = "gopher"

=adalah operator penugasan. Ini digunakan dengan cara yang sama seperti Anda menggunakannya dalam bahasa lain.

Anda dapat menghilangkan tipe ketika Anda mendeklarasikan variabel dan initializer hadir ( http://tour.golang.org/#11 ).


Β«= Adalah operator penugasan. Ini digunakan dengan cara yang sama seperti Anda menggunakannya dalam bahasa lain. Β» Kecuali di Ada di mana =hanya untuk perbandingan dan :=untuk penugasan ...
Alexis Wilke

13

The: = berarti mendeklarasikan dan menetapkan sementara = berarti untuk menetapkan secara sederhana.


11

:=mendeklarasikan dan memberikan, =hanya menetapkan

Ini berguna ketika Anda tidak ingin mengisi kode Anda dengan deklarasi tipe atau struct.

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

dari dokumen referensi: ( tour.golang.org )

Di dalam suatu fungsi , :=pernyataan penugasan singkat dapat digunakan sebagai pengganti deklarasi var dengan tipe implisit.

Di luar fungsi , setiap konstruk dimulai dengan kata kunci (var, func, dan sebagainya) dan: = konstruk tidak tersedia.



2

Keduanya adalah teknik deklarasi variabel yang berbeda dalam bahasa Go.

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

DAN

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

Deklarasi variabel pendek adalah singkatan untuk deklarasi variabel reguler dengan ekspresi initializer tetapi tanpa tipe.

Baca di bawah untuk detail:

Deklarasi variabel

Deklarasi variabel pendek


10
Saya pikir sintaks Anda salah untuk contoh pertama. Alih-alih: var firstName: = "John", seharusnya: var firstName = "John"
Gino
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.