Maison  >  Article  >  développement back-end  >  Pourquoi l’ajout à une tranche Go modifie-t-il parfois la tranche d’origine ?

Pourquoi l’ajout à une tranche Go modifie-t-il parfois la tranche d’origine ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-31 17:00:30722parcourir

Why does appending to a Go slice sometimes modify the original slice?

Comportement d'allocation de tranche de Golang Append

Dans Go, lors de l'ajout à une tranche, il est nécessaire de comprendre le comportement d'allocation pour garantir une gestion efficace.

Selon la documentation de l'API intégrée, la fonction append() réaffecte et copie les données dans un nouveau bloc de tableau lorsque la capacité de la tranche existante est insuffisante. Cela soulève des questions sur la nature du descripteur de tranche et sur la tranche renvoyée par append().

Dans l'algorithme récursif fourni pour générer des combinaisons, la fonction append() est utilisée pour construire des tranches de manière incrémentale. Cependant, on observe que les tranches envoyées sur un canal depuis la fonction AddOption sont modifiées après avoir été envoyées. Cela contredit l'attente selon laquelle append() devrait renvoyer une nouvelle tranche.

Pour résoudre cette divergence apparente, il est essentiel de clarifier la distinction entre le type de données slice et sa représentation sous-jacente. Le descripteur de tranche se compose de deux entiers (longueur et capacité) et d'un pointeur vers les données réelles. Lorsque append() crée une nouvelle tranche, il génère un nouveau descripteur de tranche mais conserve le même pointeur de données que la tranche d'origine. Par conséquent, les modifications apportées à l'un ou l'autre descripteur de tranche affectent les deux tranches.

Pour illustrer cela, considérons l'extrait de code suivant :

<code class="go">s := make([]int, 0, 5)
s = append(s, []int{1, 2, 3, 4}...)

a := append(s, 5)
fmt.Println(a)  // [1 2 3 4 5]

b := append(s, 6)
fmt.Println(b)  // [1 2 3 4 6]
fmt.Println(a)  // [1 2 3 4 6]</code>

Initialement, s a une capacité de 5 et est construit en utilisant make (). append() est utilisé pour ajouter les éléments d'une autre tranche à s. Ensuite, deux nouvelles tranches, a et b, sont créées en utilisant append() sur s avec des éléments différents. En observant la sortie, a et b contiennent les mêmes données, indiquant qu'ils partagent le même pointeur de données. Cela démontre le comportement décrit ci-dessus.

Pour garantir une manipulation efficace des tranches, il est crucial de comprendre ce comportement d'allocation de append(). Si la capacité de la tranche existante est suffisante, append() manipulera directement le pointeur de données existant, le rendant plus efficace.

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