2016-03-15 9 views
10

Das Programm available on The Go PlaygroundWarum kann eine Zeichenfolge in Go nicht null sein?

package main 

import "fmt" 

func main() { 
    var name string = nil 
    fmt.Println(name) 
} 

und ergibt einen Fehler liest

prog.go:6: cannot use nil as type string in assignment 

ich "" is the "zero value" for strings verstehen. Ich verstehe nicht, warum ich nil nicht zu meinem string zuweisen kann.

+0

Sie können 'nil' auch nicht' int' zuweisen. Warum überrascht dich das für Streicher? –

+0

Durch die Verhinderung der Zuweisung von Nullen zu Strings wird eine Fehlerklasse eliminiert. Hinweis [string pointers] (https://dhdersch.github.io/golang/2016/01/23/golang-when-to-use-string-pointers.html) kann nil zugewiesen werden. – Mark

+1

Nicht sicher, warum dies abgelehnt wurde. Scheint wie eine ziemlich legitime Frage an mich – Brendan

Antwort

16

Die einfache Antwort ist, dass nil nicht als gültiger Wert für den Typ string im language specification definiert ist.

... aber vielleicht möchten Sie eine längere Antwort?

nil ist der Nullwert für Zeiger, Schnittstellen, Kanäle, Slices, Karten und Funktionstypen, und es stellt einen nicht initialisierten Zustand dar.

Betrachten Sie die folgenden Variablendeklarationen:

var a *SomeType 
var b interface{} 
var c func() 

Es scheint natürlich, dass all diese Variablen einen Wert haben würde, die nicht initialisierten Zustand darstellt. a wurde als Zeiger deklariert, aber worauf würde es hinweisen, wenn wir es noch nicht auf etwas hingewiesen haben? nil ist ein offensichtlicher Nullwert für diese Typen.

Wie für die Kanäle, Scheiben und Karten, deren Wert Null ist nil aus dem einfachen Grund, dass ihre Umsetzung so ist, dass sie müssen explizit initialisiert werden, bevor sie verwendet werden können. Dies geschieht meist aus Performance-Gründen, diese Typen werden alle intern als mehr oder weniger komplexe Datenstrukturen dargestellt und deren Initialisierung ist nicht frei.

Eine string erfordert jedoch keine Initialisierung, und es scheint natürlich, dass der Standardwert Null für eine neue Zeichenfolgenvariable eine leere Zeichenfolge "" wäre. Daher gibt es einfach keinen Grund dafür, dass nil ein gültiger Zeichenfolgenwert ist, und das Hinzufügen zu der Spezifikation würde die Sprache nur komplizierter und mühsamer machen.

Außerdem, was würde nil vom Typ stringrepräsentieren? Eine leere Zeichenfolge? Das haben wir schon. Eine nicht initialisierte Zeichenfolge? Das gibt es nicht.

+0

Danke für die Erklärung. – user319286

+0

Tipp: Wenn Sie mit optionalen Parametern arbeiten - Sie können jedoch einen Zeiger auf Ihre Zeichenfolge übergeben, und Zeiger können Null sein. (Sie können auch eine leere Zeichenfolge verwenden.) –

0

In gehen string ist ein Datentyp, es ist kein Zeiger auf ein Array wie C/C++. Als solches können Sie es nicht zu Null zuweisen.