In Go kann das Anhängen von Elementen an ein Slice innerhalb einer Schleife die Werte vorhandener Slices, die aus demselben zugrunde liegenden Array erstellt wurden, unerwartet ändern.
Das Problem ergibt sich aus der Art und Weise, wie Slices auf die zugrunde liegenden Array-Werte verweisen. Wenn Sie an ein Slice anhängen, wird möglicherweise das vorhandene Array geändert oder ein neues erstellt. Wenn das Slice jedoch mit der Make-Funktion erstellt wurde, verweist es immer auf dasselbe zugrunde liegende Array.
Betrachten Sie den folgenden Code:
<code class="go">func create(iterations int) []int { a := make([]int, 0) for i := 0; i < iterations; i++ { a = append(a, i) } return a } func main() { sliceFromLoop() sliceFromLiteral() } func sliceFromLoop() { i := create(11) j := append(i, 100) g := append(i, 101) h := append(i, 102) fmt.Printf("i: %v\nj: %v\ng: %v\nh:%v\n", i, j, g, h) } func sliceFromLiteral() { i := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10} j := append(i, 100) g := append(i, 101) h := append(i, 102) fmt.Printf("i: %v\nj: %v\ng: %v\nh:%v\n", i, j, g, h) }</code>
Im SliceFromLoop Funktion teilen alle neuen Slices (j, g, h) dasselbe zugrunde liegende Array wie das anfängliche Slice i. Das bedeutet, dass beim Anhängen an i das letzte Element aller anderen Slices geändert wird.
Um dieses Verhalten zu vermeiden, wird empfohlen, vor dem Anhängen eine Kopie des Slice zu erstellen dazu. Die Kopierfunktion weist ein neues Slice mit denselben Elementen wie das Original zu.
<code class="go">func sliceFromLoopFixed() { i := create(11) j := append([]int{}, i..., 100) g := append([]int{}, i..., 101) h := append([]int{}, i..., 102) fmt.Printf("i: %v\nj: %v\ng: %v\nh:%v\n", i, j, g, h) }</code>
In diesem Fall haben die neuen Slices j, g und h ihre eigenen zugrunde liegenden Arrays, sodass der Wert von i unberührt bleibt durch die Anhänge.
Das obige ist der detaillierte Inhalt vonWarum zeigen Slices, die aus demselben zugrunde liegenden Array erstellt wurden, unerwartetes Verhalten, wenn sie in Go angehängt werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!