Maison > développement back-end > Golang > Pourquoi la suppression des éléments de la première tranche modifie-t-elle la capacité, mais pas la suppression des derniers éléments ?

Pourquoi la suppression des éléments de la première tranche modifie-t-elle la capacité, mais pas la suppression des derniers éléments ?

Susan Sarandon
Libérer: 2024-11-02 21:58:02
original
1145 Les gens l'ont consulté

Why Does Dropping First Slice Elements Change Capacity, But Dropping Last Elements Doesn't?

Modification de la capacité des tranches : différences entre la suppression du premier et du dernier élément

Lors de l'exploration de la fonctionnalité de tranche de Go, une question courante se pose : pourquoi une tranche La capacité se comporte-t-elle différemment lors de la suppression des n premiers éléments par opposition aux n derniers éléments ?

Pour répondre à cette question, il est important de comprendre que les tranches Go sont structurées comme suit :

type slice struct {
    array unsafe.Pointer
    len   int
    cap   int
}
Copier après la connexion

Suppression des n derniers éléments

Lors de la suppression des n derniers éléments d'une tranche (par exemple, s = s[:len(s)-2]), les données de la tranche sont toujours stockées dans le tableau sous-jacent . Le champ len est mis à jour pour refléter la nouvelle longueur de la tranche, tandis que le champ cap reste inchangé. Cela préserve la même allocation de tableau pour la tranche.

Suppression des n premiers éléments

Cependant, lorsque les n premiers éléments sont supprimés (par exemple, s = s[2 : ]), les données sous-jacentes de la tranche doivent être déplacées vers une autre partie du même tableau. En effet, l'emplacement mémoire d'origine des n premiers éléments n'est plus valide. En conséquence, une nouvelle tranche est créée avec un pointeur de tableau différent, ajustant à la fois les champs len et cap.

Pour illustrer cela, améliorons la fonction printSlice pour afficher le pointeur vers le tableau sous-jacent :

<code class="go">func printSlice(s []int) {
    var ptr *int
    if cap(s) >= 1 {
        ptr = &amp;s[:cap(s)][0]
    }
    fmt.Printf("ptr=%p len=%d cap=%d %v\n", ptr, len(s), cap(s), s)
}</code>
Copier après la connexion

L'exécution de ce code modifié montre comment les opérations de découpage modifient le pointeur, la longueur et la capacité, confirmant le comportement décrit ci-dessus.

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