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 string
repräsentieren? Eine leere Zeichenfolge? Das haben wir schon. Eine nicht initialisierte Zeichenfolge? Das gibt es nicht.
Sie können 'nil' auch nicht' int' zuweisen. Warum überrascht dich das für Streicher? –
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
Nicht sicher, warum dies abgelehnt wurde. Scheint wie eine ziemlich legitime Frage an mich – Brendan