Perbedaan antara: = dan = operator di Go

283

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

Chris
sumber
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.

zzzz
sumber
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.

Kekacauan
sumber
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:

Inanc Gumus
sumber
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 ).

ShuklaSannidhya
sumber
ยซ= 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.

Ralph Caraveo
sumber
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)
Gustav
sumber
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.

Subhash Kumar Singh
sumber
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

Pravin Mishra
sumber
10
Saya pikir sintaks Anda salah untuk contoh pertama. Alih-alih: var firstName: = "John", seharusnya: var firstName = "John"
Gino