Heim >Backend-Entwicklung >Golang >Warum führt das Anhängen von Zeigern an ein Slice in Go zu unerwarteten überschriebenen Werten?

Warum führt das Anhängen von Zeigern an ein Slice in Go zu unerwarteten überschriebenen Werten?

Barbara Streisand
Barbara StreisandOriginal
2024-12-15 09:24:10498Durchsuche

Why Does Appending Pointers to a Slice in Go Result in Unexpected Overwritten Values?

Seltsames Golang-„Anhänge“-Verhalten: Überschreiben von Werten im Slice

In Golang ist es beim Anhängen an ein Slice wichtig, den Unterschied zu verstehen zwischen Zeiger- und Nicht-Zeigertypen.

Betrachten Sie das Beispiel Code:

import "fmt"

type Foo struct {
    val int
}

func main() {
    var a = make([]*Foo, 1)
    a[0] = &Foo{0}

    var b = [3]Foo{Foo{1}, Foo{2}, Foo{3}}
    for _, e := range b {
        a = append(a, &e)
    }

    for _, e := range a {
        fmt.Printf("%v ", *e)
    }
}

Die erwartete Ausgabe ist {0} {1} {2} {3}, aber stattdessen wird {0} {3} {3} {3} ausgegeben. Dies liegt daran, dass die for-Schleife mit Kopien der Array-Elemente arbeitet.

Beim Durchlaufen des for ...-Bereichs wird eine temporäre Schleifenvariable erstellt und ihr der Wert des Array-Elements zugewiesen. In diesem Fall ist die temporäre Variable vom Typ Foo. Beim Anhängen an das Slice wird jedoch die Adresse der temporären Variablen anstelle der Adresse des tatsächlichen Array-Elements hinzugefügt.

Diese temporäre Variable wird in jeder Schleifeniteration mit dem Wert des letzten Elements des überschrieben Array, das Foo{3} ist. Infolgedessen enthält das Slice mehrere Verweise auf denselben Zeiger, der auf das letzte Element des Arrays zeigt.

Um das Problem zu beheben, sollte die Adresse des Array-Elements anstelle der Schleifenvariablen angehängt werden:

for i := range b {
    a = append(a, &b[i])
}

Mit dieser Änderung ist die Ausgabe wie erwartet: {0} {1} {2} {3}.

Dieses Verhalten unterstreicht die Bedeutung des Verständnisses Das Typsystem von Go und die Unterscheidung zwischen Zeigern und Nichtzeigern bei der Arbeit mit Slices.

Das obige ist der detaillierte Inhalt vonWarum führt das Anhängen von Zeigern an ein Slice in Go zu unerwarteten überschriebenen Werten?. 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