Ich habe eine Favorites
Struktur mit einer Scheibe Feld:Gibt es eine Möglichkeit, eine Struktur mit einem Schnittfeld mit der Nullwertstruktur zu vergleichen?
type Favorites struct {
Color string
Lunch string
Place string
Hobbies []string
}
und ich habe ein Person
, die die andere Struktur enthält:
type Person struct {
Name string
Favorites Favorites
}
Ich mag würde, um zu sehen, ob das Favorites
Feld gesetzt Person. Für andere Arten von Feldern, zum Beispiel eine Zeichenfolge oder ein Int, würde ich dieses Feld mit dem Nullwert vergleichen ("" bzw. 0).
Wenn ich versuche, mit dem Null zu vergleichen, wie unten ich den Fehler invalid operation: p2.Favorites == zeroValue (struct containing []string cannot be compared)
:
p2 := Person{Name: "Joe"}
zeroValue := Favorites{}
if p2.Favorites == zeroValue {
fmt.Println("Favorites not set")
}
Das paßt, was in der Spezifikation definiert (https://golang.org/ref/spec#Comparison_operators).
Gibt es einen solchen Vergleich, abgesehen von einem mühsamen Vergleich jedes einzelnen Feldes (und daran zu denken, es zu aktualisieren, wenn sich die Struktur ändert)?
Eine Option besteht darin, das Feld Favoriten einen Zeiger auf die Struktur anstelle der Struktur selbst zu machen und dann einfach mit Null zu vergleichen, aber dies ist in einer großen Codebasis, also würde ich lieber keine weitreichenden Änderungen vornehmen Fall.
https://play.golang.org/p/d0NSp8eBes
Können Sie erklären, warum Sie nicht zu bevorzugen das Feld 'Favoriten' zu einem Zeiger machen? Wenn Sie sich nicht um die Äquivalenz kümmern und nur versuchen zu überprüfen, ob das Feld überhaupt gesetzt ist, dann scheint dies die beste Option zu sein. – daltonclaybrook
Um zu meinem vorherigen Kommentar hinzuzufügen, würde ich vorschlagen vorsichtig zu sein über die Verwendung des Nullwerts, um "un-set" auch auf anderen Typen zu bezeichnen. 0 kann ein absolut gültiger Wert für ein int-Feld sein. – daltonclaybrook
@daltonclaybrook Es wäre normalerweise die beste Option. In einer großen Codebasis, in der die Struktur überall verwendet wird, würde ich mich mehr um die Änderung kümmern. Auch wenn es viele Strukturfelder in der Struktur gibt, scheint es, als ob ich eine zu einem Zeiger ändere, und aus Gründen der Konsistenz sollte ich wahrscheinlich alle ändern. – stephenbez