Maison > développement back-end > Golang > Quand la fonction `append()` de Golang alloue-t-elle une nouvelle tranche ?

Quand la fonction `append()` de Golang alloue-t-elle une nouvelle tranche ?

Patricia Arquette
Libérer: 2024-11-02 03:27:30
original
268 Les gens l'ont consulté

When Does Golang's `append()` Function Allocate a New Slice?

Quand Golang Append() crée-t-il 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>
Copier après la connexion

Sortie :

[1 2 3 4 5]
[1 2 3 4 6]
[1 2 3 4 6]
Copier après la connexion

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>
Copier après la connexion

Le résultat devient :

[1 2 3 4 5]
[1 2 3 4 6]
[1 2 3 4 5]
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal