Maison > Article > développement back-end > Quand la fonction `append()` de Golang alloue-t-elle une nouvelle tranche ?
Contrairement à la documentation de l'API intégrée, la fonction append() ne crée pas toujours une nouvelle tranche . Ceci est déterminé par la capacité de la tranche d'origine et le nombre d'éléments à ajouter.
Dans l'extrait de code fourni, où des combinaisons de booléens sont créées de manière récursive, les points d'exclamation indiquent les tranches envoyées dans le canal depuis la fonction AddOption. Cependant, les tranches qui émergent de l'autre côté dans main() sont modifiées.
La confusion vient de la distinction entre le type de données slice et sa représentation interne. Le descripteur de tranche se compose de deux entiers (longueur et capacité) et d'un pointeur vers les données sous-jacentes. Par conséquent, append() renvoie une nouvelle tranche avec un nouveau descripteur mais le même pointeur vers les données.
Ceci est illustré dans l'exemple de code suivant :
<code class="go">package main import "fmt" func main() { s := make([]int, 0, 5) // Create a slice with zero length and capacity 5 s = append(s, []int{1, 2, 3, 4}...) // Append a slice of integers a := append(s, 5) // Append one element (slice descriptor and data pointer remain the same) fmt.Println(a) b := append(s, 6) // Append one element (slice descriptor and data pointer remain the same) fmt.Println(b) fmt.Println(a) }</code>
Sortie :
[1 2 3 4 5] [1 2 3 4 6] [1 2 3 4 6]
Cela démontre que a et b partagent le même pointeur de données car la tranche d'origine a toujours de la capacité. Cependant, si nous réduisons la capacité à 4 :
<code class="go">s := make([]int, 0, 4)</code>
Le résultat devient :
[1 2 3 4 5] [1 2 3 4 6] [1 2 3 4 5]
La tranche d'origine n'ayant plus de capacité suffisante, append() crée une nouvelle tranche avec un nouveau pointeur de données pour b.
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!