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
Susan Sarandonoriginal
2024-11-02 21:58:021020parcourir

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
}

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>

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