Ich sehe viel Code in Go, um Null zu erkennen, wie folgt:
if err != nil {
// handle the error
}
Ich habe jedoch eine Struktur wie diese:
type Config struct {
host string
port float64
}
und config ist eine Instanz von Config, wenn ich Folgendes tue:
if config == nil {
}
Es liegt ein Kompilierungsfehler vor, der besagt, dass nil nicht in den Typ Config konvertiert werden kann
Antworten:
Der Compiler zeigt den Fehler auf Sie, Sie vergleichen eine Strukturinstanz mit nil. Sie sind nicht vom gleichen Typ, daher wird dies als ungültiger Vergleich angesehen und Sie angeschrien.
Was Sie hier tun möchten, ist, einen Zeiger auf Ihre Konfigurationsinstanz mit nil zu vergleichen, was ein gültiger Vergleich ist. Dazu müssen Sie entweder die golang können neue builtin oder initialisieren einen Zeiger darauf:
oder
oder
Dann können Sie überprüfen, ob
quelle
var config &Config // nil
sollte sein:var config *Config
var config *Config
stürzt ab mitinvalid memory address or nil pointer dereference
. Vielleicht brauchen wirvar config Config
Siehe zusätzlich zu Oleiade die Spezifikation für Nullwerte :
Wie Sie sehen können,
nil
ist dies nicht der Nullwert für jeden Typ, sondern nur für Zeiger, Funktionen, Schnittstellen, Slices, Kanäle und Karten. Dies ist der Grund, warumconfig == nil
ein Fehler vorliegt und&config == nil
nicht.Um zu überprüfen , ob Ihre Struktur nicht initialisiert ist Sie müssen jedes Mitglied überprüfen würde für seine jeweiligen Nullwert (zB
host == ""
,port == 0
usw.) oder ein privates Feld haben , die durch eine interne Initialisierung Verfahren eingestellt wird. Beispiel:quelle
time.Time
hat deshalb eineIsZero()
Methode. Allerdings könnten Sie auch tun ,var t1 time.Time; if t1 == time.Time{}
und Sie könnten auch tunif config == Config{}
für Sie alle , das Feld zu überprüfen (struct Gleichheit ist gut definiert in Go). Dies ist jedoch nicht effizient, wenn Sie viele Felder haben. Und vielleicht ist der Nullwert ein vernünftiger und verwendbarer Wert, daher ist es nichts Besonderes, einen Wert einzugeben.func (c *Config) Initialized() bool { return !(c == nil) }
Ich habe einen Beispielcode erstellt, der neue Variablen auf verschiedene Arten erstellt, die ich mir vorstellen kann. Es sieht so aus, als würden die ersten drei Methoden Werte erstellen und die letzten beiden Referenzen.
welche Ausgänge:
quelle
Sie können auch gerne überprüfen
struct_var == (struct{})
. Auf diese Weise können Sie nicht mit nil vergleichen, es wird jedoch geprüft, ob es initialisiert ist oder nicht. Seien Sie vorsichtig, wenn Sie diese Methode anwenden. Wenn Ihre Struktur für alle Felder Nullwerte haben kann, haben Sie keine gute Zeit.http://play.golang.org/p/RXcE06chxE
quelle
In der Sprachspezifikation wird das Verhalten von Vergleichsoperatoren erwähnt:
Vergleichsoperatoren
Zuweisbarkeit
quelle
In Go 1.13 und höher können Sie
Value.IsZero
die imreflect
Paket angebotene Methode verwenden .Abgesehen von den Basistypen funktioniert es auch für Array, Chan, Func, Interface, Map, Ptr, Slice, UnsafePointer und Struct. Siehe dies als Referenz.
quelle