Heim > Backend-Entwicklung > Golang > Warum geben Slice-Bereichsiterationen in Go manchmal Kopien anstelle von Adressen zurück?

Warum geben Slice-Bereichsiterationen in Go manchmal Kopien anstelle von Adressen zurück?

DDD
Freigeben: 2024-12-05 15:54:14
Original
209 Leute haben es durchsucht

Why Do Slice Range Iterations in Go Sometimes Return Copies Instead of Addresses?

Das Slice-Range-Phänomen in Go verstehen

In Go kann das Verhalten von Slice-Bereichen verwirrend sein. Wenn man mit einer Range-Klausel über einen Slice iteriert, ist man versucht zu glauben, dass die Iterationsvariable die Adresse jedes Elements enthält. Dies ist jedoch nicht immer der Fall. Ein solches Szenario ist die Arbeit mit Strukturen und Karten.

Betrachten Sie den folgenden Code:

type student struct {
    Name string
    Age  int
}

func main() {
    m := make(map[string]*student)
    s := []student{
        {Name: "Allen", Age: 24},
        {Name: "Tom", Age: 23},
    }

    for _, stu := range s {
        m[stu.Name] = &stu
    }
}
Nach dem Login kopieren

Dieser Code iteriert über ein Segment von Strukturen und fügt einer Karte ein Schlüssel-Wert-Paar hinzu jede Struktur und speichert die Adresse der Struktur als Wert. Die resultierende Karte zeigt jedoch, dass alle Werte auf dieselbe Adresse verweisen.

Um dieses Phänomen zu erklären, müssen wir uns die zugrunde liegende Implementierung von Slice-Bereichen ansehen. Wenn ein Slice mithilfe einer Range-Klausel iteriert wird, erhält die Iterationsvariable eine Kopie des Elements aus dem Slice. Somit enthält die Iterationsvariable eine Kopie der Struktur, nicht ihre Adresse.

Um dieses Problem zu beheben und die Adresse der Struktur in der Karte zu speichern, muss der Code geändert werden, um die Adresse des Slice-Elements zu übernehmen :

for i := range s {
    m[s[i].Name] = &s[i]
}
Nach dem Login kopieren

Diese Änderung stellt sicher, dass die Iterationsvariable die Adresse der Struktur enthält und die Karte die Adressen jeder Struktur im Slice korrekt speichert.

Das obige ist der detaillierte Inhalt vonWarum geben Slice-Bereichsiterationen in Go manchmal Kopien anstelle von Adressen zurück?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage