Maison  >  Article  >  développement back-end  >  Pourquoi les tranches créées à partir du même tableau sous-jacent présentent-elles un comportement inattendu lorsqu'elles sont ajoutées dans Go ?

Pourquoi les tranches créées à partir du même tableau sous-jacent présentent-elles un comportement inattendu lorsqu'elles sont ajoutées dans Go ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-04 02:15:29870parcourir

Why do slices created from the same underlying array exhibit unexpected behavior when appended to in Go?

Comportement inattendu d'ajout de tranche

Dans Go, l'ajout d'éléments à une tranche dans une boucle peut modifier de manière inattendue les valeurs des tranches existantes créées à partir du même tableau sous-jacent.

Origine du problème

Le problème vient de la façon dont les tranches référencent les valeurs du tableau sous-jacent. Lorsque vous ajoutez à une tranche, cela peut modifier le tableau existant ou en créer un nouveau. Cependant, si la tranche a été créée à l'aide de la fonction make, elle fait toujours référence au même tableau sous-jacent.

Exemple

Considérez le code suivant :

<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>

Dans le sliceFromLoop fonction, toutes les nouvelles tranches (j, g, h) partagent le même tableau sous-jacent que la tranche initiale i. Cela signifie que lorsque nous ajoutons à i, cela modifie le dernier élément de toutes les autres tranches.

Solution

Pour éviter ce comportement, il est recommandé de faire une copie de la tranche avant d'ajouter à cela. La fonction de copie alloue une nouvelle tranche avec les mêmes éléments que l'original.

<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>

Dans ce cas, les nouvelles tranches j, g et h ont leurs propres tableaux sous-jacents, donc la valeur de i reste inchangée par les annexes.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn