2016-03-14 13 views
10

Ci sono molti casi utilizzando nullo in golang, come questo:Cosa vuol dire nil in golang?

func (u *URL) Parse(ref string) (*URL, error) { 
    refurl, err := Parse(ref) 
    if err != nil { 
     return nil, err 
    } 
    return u.ResolveReference(refurl), nil 
} 

ma non possiamo usare in questo modo:

var str string //or var str int 
str = nil 

il compilatore golang viene generato un errore can't use nil as type string in assignment.

Sembra che lo nil possa essere utilizzato solo per il puntatore di struct e di interfaccia, quindi come si intende? e quando lo usiamo per confrontare con l'altro oggetto, come si confrontano, cioè come giudicare golan un oggetto è nil?

MODIFICA: Ad esempio, se un'interfaccia è nil, il suo tipo e valore devono essere nulli allo stesso tempo. Come Golang lo fa?

+4

Dovrai capire i tipi Go e i diversi valori che un oggetto di ciascun tipo può avere. Tutti i dettagli su quali elementi sono nulli, assegnabili a zero, paragonabili a zero e così a sono spiegati in https://golang.org/ref/spec che è abbastanza breve da essere letto in una volta e abbastanza chiaro da capirlo. – Volker

+0

La stringa vuota in Vai è "".Per verificare se una stringa ha un valore, basta 'str ==" "' – LibertyLocked

risposta

30

In Vai, nil è il valore zero per puntatori, interfacce, mappe, fette, canali e tipi di funzione, che rappresenta un valore non inizializzato .

nil non indica uno stato "non definito", è un valore appropriato di per sé. Un oggetto in Go è nil semplicemente se e solo se il suo valore è nil, che può essere solo se è di uno dei tipi sopra menzionati.

Un error è un'interfaccia, quindi nil è un valore valido per uno, a differenza di uno string. Per ovvi motivi un errore nil rappresenta nessun errore.

1

nil in Go è semplicemente il valore del puntatore NULL di altre lingue.

È possibile utilizzarlo efficacemente al posto di qualsiasi puntatore o interfaccia (le interfacce sono in qualche modo puntatori).

È possibile utilizzarlo come errore, perché error type is an interface.

Non è possibile utilizzarlo come stringa perché in Go, una stringa è un valore.

nil è tipizzato in Go, nel senso che non è possibile farlo:

var n = nil 

Perché qui ti manca un tipo per n. Tuttavia, si può fare

var n *Foo = nil 

Nota che nil essendo il valore zero di puntatori e interfacce, puntatori e interfacce non inizializzati sarà nil.

+0

Errore: 'nil' non ha alcun tipo. Non è stato digitato Non si può fare: 'var n = nil' non perché nil ha un tipo, è perché, il compilatore non può derivare quale sarà il tipo di' n', non può differire il tipo, perché, 'nil 'non ha tipo. –

+0

Grazie per aver segnalato l'errore, tanto tempo dopo la risposta. Una modifica sarebbe stata più _a propos_. Ma grazie comunque. – Elwinar

+0

Giusto, nessun problema. –