2016-03-14 7 views
10

Es gibt viele Fälle nil in golang verwendet wird, wie folgt aus:Was bedeutet 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 
} 

aber wir können es nicht wie diesen:

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

der golang Compiler einen can't use nil as type string in assignment Fehler werfen.

Sieht aus wie die nil kann nur verwendet werden, um Zeiger der Struktur und Schnittstelle, dann wie heißt es? und Wenn wir es verwenden, um mit dem anderen Objekt zu vergleichen, wie sie vergleichen, das bedeutet, wie Golang ein Objekt zu beurteilen ist Null?

EDIT: Zum Beispiel, wenn eine Schnittstelle Null ist, muss zugleich sein, seine Art und Wert gleich Null. Wie Golang es schaffen?

+4

Sie müssen Go-Typen und die verschiedenen Werte verstehen, die ein Objekt jedes Typs haben kann. Alle Details darüber, welche Dinge null sind, können nil zugewiesen werden, vergleichbar mit null und so werden in https://golang.org/ref/spec erklärt, das kurz genug ist, um auf einmal zu lesen und klar genug, um es zu verstehen. – Volker

+0

Leere Zeichenfolge in Go ist "".Um zu testen, ob ein String Wert hat, einfach "str ==" "' – LibertyLocked

Antwort

30

In Go, nil ist der Nullwert für Zeiger, Schnittstellen, Karten, Scheiben, Kanäle und Funktionstypen, was einen uninitialized Wert.

nil bedeutet nicht einen "undefinierten" Zustand, es ist ein angemessener Wert für sich. Ein Objekt in Go ist nil einfach wenn und nur wenn es Wert ist nil, die es nur sein kann, wenn es von einem der oben genannten Typen ist.

Ein error ist eine Schnittstelle, also nil ist ein gültiger Wert für einen, anders als für eine string. Aus offensichtlichen Gründen stellt ein nil Fehler keinen Fehler.

1

nil in Go ist einfach der NULL Zeigerwert von anderen Sprachen.

Sie können es effektiv anstelle von jedem Zeiger oder Schnittstelle (Schnittstellen sind ein wenig Zeiger) verwenden.

Sie können es als Fehler verwenden, weil die error type is an interface.

Sie können es nicht als Zeichenfolge verwenden, da in Go eine Zeichenfolge ein Wert ist.

nil ist nicht typisiert in Go, das heißt, Sie das nicht tun können:

var n = nil 

Denn hier gibt es einen Typ für n fehlt. Sie können jedoch

var n *Foo = nil 

Beachten Sie, dass nil wobei der Nullwert von Zeigern und Schnittstellen, nicht initialisierten Zeiger und Schnittstellen tun wird nil.

+0

Falsch: 'nil' hat keinen Typ. Es ist nicht getippt. Sie können nicht: 'var n = nil 'nicht, weil nil einen Typ hat, weil der Compiler nicht ableiten kann, was der Typ von' n' ist, er kann den Typ nicht verzögern, weil 'nil 'hat keinen Typ. –

+0

Danke für den Hinweis auf den Tippfehler, so lange nach der Antwort. Eine Bearbeitung wäre mehr _a propos_ gewesen. Aber trotzdem danke. – Elwinar

+0

Richtig, kein Problem. –