Heim >Backend-Entwicklung >Golang >Warum führen Array-Vergleiche leerer Strukturen in Go manchmal zu unerwarteten Ergebnissen?
Warum Array-Vergleiche von Strukturen zu ungleichen Ergebnissen führen
In Go kann der Vergleich von Arrays leerer Strukturen zu unerwarteten Ergebnissen führen. Dieses Verhalten ist auf die subtile Natur von Zeigern und Variablen der Größe Null in der Sprache zurückzuführen.
Zeiger auf Variablen der Größe Null
Gemäß der Go-Spezifikation Zeiger auf Unterschiedliche Variablen der Größe Null haben nicht unbedingt eindeutige Adressen. Dies liegt daran, dass Variablen der Größe Null vom Compiler möglicherweise wegoptimiert werden, was zu einer unvorhersehbaren Speicherzuweisung führt.
Beispiel
Betrachten Sie den folgenden Code:
var s, ss struct{} // two empty structs arr1 := [6]*struct{}{&s} // array with empty struct pointer arr2 := [6]*struct{}{&ss} // array with empty struct pointer fmt.Println(&s == &ss, arr1 == arr2) // false, true
In diesem Beispiel sind arr1 und arr2 zwei Arrays, die Zeiger auf verschiedene leere Strukturen, s und ss, enthalten. Überraschenderweise gibt der Vergleich arr1 == arr2 true zurück. Dies liegt daran, dass der Compiler s und ss trotz ihrer unterschiedlichen Identität möglicherweise an derselben Adresse platziert hat. &s == &ss wird jedoch als falsch ausgewertet, da es die Zeiger selbst direkt vergleicht.
Int-Variablen in Strukturen
Wenn jedoch Werte ungleich Null in der gespeichert werden Bei Strukturen wie Ganzzahlen ändert sich das Vergleichsverhalten.
var l, ll struct{A int}{} arr3 := [6]*struct{A int}{&l} // array with empty struct pointer arr4 := [6]*struct{A int}{&ll} // array with empty struct pointer fmt.Println(&l == &ll, arr3 == arr4) // false, false
In diesem Fall der Vergleich von arr3 und arr4 gibt „false“ zurück, was darauf hinweist, dass die Arrays nicht gleich sind. Dies liegt daran, dass die in den Strukturen gespeicherten Ganzzahlen ungleich Null ihnen unterschiedliche Adressen geben.
Escape-Analyse und Variablenverschiebung
Das unerwartete Verhalten kann auch durch die Escape-Analyse beeinflusst werden , eine Compiler-Optimierung, die bestimmt, ob Variablen auf dem Heap oder Stack zugewiesen werden müssen. Wenn eine Variable ihren lokalen Gültigkeitsbereich verlässt, wird sie auf dem Heap zugewiesen, um ihre Zugänglichkeit in anderen Teilen des Programms sicherzustellen.
Wenn Zeiger auf leere Strukturen entkommen, kann der Compiler sie dorthin verschieben verschiedene Heap-Adressen. Diese Verschiebung wirkt sich auf ihren Gleichheitsvergleich aus und führt zu „falsch“.
Das obige ist der detaillierte Inhalt vonWarum führen Array-Vergleiche leerer Strukturen in Go manchmal zu unerwarteten Ergebnissen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!