Differenza tra: = e = operatori in Vai


283

Qual è la differenza tra il =e :=operatori, e quali sono i casi d'uso per loro? Entrambi sembrano essere per un incarico?


2
Vedi anche : Vai alla guida visiva delle variabili . Ho scritto un articolo a riguardo.
Inanc Gumus,

1
La semantica ...
JustDave,

Se si desidera utilizzare un tipo specifico x := uint32(123), ad esempio. Deve essere ovvio per la maggior parte delle persone, ma ho dovuto pensare qualche minuto ;-)
Kenji Noguchi,

Risposte:


198

È solo =l'operatore di assegnazione.

:=fa parte della sintassi della clausola delle dichiarazioni delle variabili brevi .

👉 Ci sono alcune regole però. Vedi questa altra risposta per maggiori dettagli.


quindi significa variabile con tipo inferito? giusto?
Krupal Shah,

@KrupalShah il link alla documentazione dice letteralmente che: "È una scorciatoia per una dichiarazione variabile regolare con espressioni di inizializzazione ma nessun tipo:" golang.org/ref/spec#Short_variable_declarations
akshaynagpal

1
Sembra che :=sia elencato come operatore qui golang.org/ref/spec#Operators_and_punctuation , quindi non sono sicuro di essere d'accordo sul fatto che "in :=realtà non è un operatore"
Poteri

347

In Go, :=è per dichiarazione + assegnazione, mentre =è solo per assegnazione.

Ad esempio, var foo int = 10 è uguale a foo := 10.


4
Esiste un caso d'uso =rispetto a :=? Dovresti solo usare sempre :=?
Kenny Worden,

3
@KennethWorden Go non ti consente :=di assegnarlo a una variabile che è già stata dichiarata, a meno che tu non stia assegnando a più variabili contemporaneamente e almeno una di queste sia nuova.
Kenny Bania,

5
il intnon è necessaria, var foo = 10è lo stesso chefoo := 10
Gary Lyn

@KennyWorden, sì. Non puoi usare: = al di fuori di una funzione.
Karuhanga,

106

Come altri hanno già spiegato, :=è sia per la dichiarazione, l'incarico, sia per la redeclaration; e indovina ( deduce ) automaticamente il tipo di variabile.

Ad esempio, foo := 32è una forma abbreviata di:

var foo int
foo = 32

// OR:
var foo int = 32

// OR:
var foo = 32

/ * Ci sono alcune regole: * /

★ 1a regola:

Non è possibile utilizzare :=fuori funcs. È perché, al di fuori di ogni funzione, un'istruzione dovrebbe iniziare con una parola chiave.

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

★ 2a regola:

Non puoi usarli due volte ( nello stesso ambito ):

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

Perché, :=introduce "una nuova variabile" , quindi usarla due volte non dichiara nuovamente una seconda variabile, quindi è illegale.


★ 3a regola:

Puoi usarli per dichiarazioni e assegnazioni a più variabili:

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

★ 4a regola (redeclaration):

Puoi usarli due volte nelle dichiarazioni "multi-variabile" , se una delle variabili è nuova :

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

Questo è legale, perché non stai dichiarando tutte le variabili, stai semplicemente riassegnando nuovi valori alle variabili esistenti e dichiarando nuove variabili allo stesso tempo. Questo si chiama redeclaration .


★ 5a regola:

È possibile utilizzare la breve dichiarazione per dichiarare una variabile in un ambito più recente anche se tale variabile è già stata dichiarata con lo stesso nome prima:

var foo int = 34

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

Qui, foo := 42è legale, perché, dichiara fooin some()ambito di func. foo = 314è legale, perché assegna un nuovo valore a foo.


★ 6a regola:

Puoi dichiarare lo stesso nome in blocchi di istruzioni brevi come: if , for , switch :

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

Perché, fooin if foo := ..., appartiene solo a quella ifclausola ed è in un ambito diverso.


Quindi, come regola generale: se vuoi dichiarare facilmente una variabile che puoi usare :=, o, se vuoi solo sovrascrivere una variabile esistente, puoi usare =.

Riferimenti:


21

:= è una scorciatoia per la dichiarazione.

a := 10
b := "gopher"

asarà dichiarato come inte inizializzato con valore 10dove as bsarà dichiarato come stringa e inizializzato con valore gopher.

Il loro uso equivalente =sarebbe

var a = 10
var b = "gopher"

=è un operatore incaricato. È usato nello stesso modo in cui lo useresti in qualsiasi altra lingua.

È possibile omettere il tipo quando si dichiara la variabile ed è presente un inizializzatore ( http://tour.golang.org/#11 ).


«= È l'operatore di assegnazione. È usato nello stesso modo in cui lo useresti in qualsiasi altra lingua. » Tranne Ada, dove =è solo per il confronto e :=per il compito ...
Alexis Wilke,

13

Il: = significa dichiarare e assegnare mentre il = = significa semplicemente assegnare.


11

:=dichiara e assegna, =assegna solo

È utile quando non si desidera riempire il codice con dichiarazioni di tipo o 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

dal documento di riferimento: ( tour.golang.org )

All'interno di una funzione , l' :=istruzione di assegnazione breve può essere utilizzata al posto di una dichiarazione var con tipo implicito.

Al di fuori di una funzione , ogni costrutto inizia con una parola chiave (var, func e così via) e il costrutto: = non è disponibile.



2

Entrambe sono la diversa tecnica della dichiarazione variabile in lingua Go.

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

E

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

Una dichiarazione di variabile breve è una scorciatoia per una dichiarazione di variabile regolare con espressioni di inizializzazione ma nessun tipo.

Leggi sotto per i dettagli:

Dichiarazioni variabili

Dichiarazioni variabili brevi


10
Penso che la tua sintassi sia sbagliata per il primo esempio. Invece di: var firstName: = "John", dovrebbe essere: var firstName = "John"
Gino
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.