Heim >Backend-Entwicklung >Golang >Warum führen Array-Vergleiche leerer Strukturen in Go manchmal zu unerwarteten Ergebnissen?

Warum führen Array-Vergleiche leerer Strukturen in Go manchmal zu unerwarteten Ergebnissen?

DDD
DDDOriginal
2024-12-21 17:25:11177Durchsuche

Why Do Array Comparisons of Empty Structures in Go Sometimes Yield Unexpected Results?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn