Maison >développement back-end >Golang >Comment la fonction `append()` de Go affecte-t-elle le comportement de la tranche lorsqu'elle est transmise par valeur ?

Comment la fonction `append()` de Go affecte-t-elle le comportement de la tranche lorsqu'elle est transmise par valeur ?

DDD
DDDoriginal
2024-11-20 15:14:15892parcourir

How Does Go's `append()` Function Affect Slice Behavior When Passed by Value?

Comprendre le comportement de Append() sur les tranches

Lorsque vous travaillez avec des tranches dans Go, il est important de comprendre comment la fonction append() interagit avec tranches passées par valeur.

Considérez le code suivant extrait :

func main() {
    slice := make([]int, 10, 10)
    slice[0] = 0
    slice[1] = 1

    slice1 := slice
    slice1[0] = 10000
    fmt.Println(slice)

    slice1 = append(slice1, 100)
    slice1[0] = 20000

    fmt.Println(slice)
}

Dans cet exemple, deux tranches (slice et slice1) sont créées, slice1 pointant initialement vers le même tableau que slice. Cependant, après le premier appel append(), slice1 se voit attribuer une nouvelle valeur de tranche qui pointe vers un tableau différent. Cette affectation fait que le comportement de slice1 est indépendant de slice.

Explication :

  • Passez par valeur : En Go, tout est passé par valeur, ce qui signifie que slice1 reçoit une copie de l'en-tête de slice de slice.
  • Ajouter avec capacité :Lors de l'ajout de plus de 0 élément à une tranche avec une capacité égale à sa longueur (comme dans ce cas), un nouveau tableau plus grand est alloué.
  • Attribution de l'en-tête de tranche : L'appel append() renvoie un nouvel en-tête de tranche pointant vers le nouveau tableau, qui est affecté à slice1.
  • Indépendant slices :Après l'affectation, slice et slice1 deviennent deux variables distinctes pointant vers des en-têtes de slice différents et, par conséquent, des tableaux différents.

Conséquences :

  • Immuabilité : Les modifications apportées aux éléments d'une tranche (par exemple, slice1) ne seront pas être reflété dans l'autre tranche (par exemple, tranche).
  • Gestion de la mémoire : Les opérations d'ajout peuvent entraîner une réallocation de mémoire, créer de nouveaux tableaux et potentiellement affecter les performances.

Pour comprendre les en-têtes de tranche et leurs éléments internes, reportez-vous aux ressources suivantes :

  • [Les tranches de Golang passent-elles par valeur ?](https://stackoverflow.com/questions/25740338/are-golang-slices-pass-by-value)
  • [Go Slices : utilisation et composants internes](https://blog.golang .org/slices)

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