Obwohl die Go-Spezifikation zur Strukturvergleichbarkeit eingehalten wird, bei der alle Felder einer Struktur vergleichbar sind, schlägt der folgende Code fehl kompilieren:
type Student struct { Name string Score uint8 } func main() { alice := Student{"Alice", 98} carol := Student{"Carol", 72} if alice >= carol { // Error: "invalid operation" println("Alice >= Carol") } else { println("Alice < Carol") } }
Der Schlüssel zum Verständnis dieses Versagens liegt in der Unterscheidung zwischen Vergleichbarkeit und Bestellbarkeit.
Während die Felder der Student-Struktur tatsächlich vergleichbar sind, ist der >=-Operator ein Ordnungsoperator und kein vergleichbarer. Diese Unterscheidung wird in der Go-Spezifikation ausdrücklich erwähnt, wo Strukturwerte als „vergleichbar, wenn alle ihre Felder vergleichbar sind“, aber nur als „gleich, wenn ihre entsprechenden nicht leeren Felder gleich sind“ definiert sind. Die Reihenfolge wird in diesem Zusammenhang nicht erwähnt.
Das Missverständnis, das zu diesem Fehler bei der Kompilierung führte, rührt von der Annahme her, dass Vergleichbarkeit Ordnungsfähigkeit impliziert. In Go sind dies unterschiedliche Konzepte. Während Strukturen auf Gleichheit verglichen werden können, können sie nicht standardmäßig sortiert werden, es sei denn, ihre Felder bieten eine bestimmte Reihenfolgebeziehung.
Das obige ist der detaillierte Inhalt vonWarum schlägt der Strukturvergleich in Go trotz vergleichbarer Felder fehl?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!