Maison  >  Article  >  développement back-end  >  Pourquoi la capacité de la tranche diminue-t-elle lors de la suppression des deux premiers éléments de la diapositive Go Tour 11, mais pas lors de l'extension de la longueur de la tranche ?

Pourquoi la capacité de la tranche diminue-t-elle lors de la suppression des deux premiers éléments de la diapositive Go Tour 11, mais pas lors de l'extension de la longueur de la tranche ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-06 06:43:03822parcourir

Why does the slice capacity decrease when dropping the first two elements in Go Tour slide 11, but not when extending the slice length?

Comprendre les changements de capacité des tranches dans le Go Tour #11

Le Go Tour fournit des démonstrations perspicaces des fonctionnalités du langage, y compris les tranches. Dans la diapositive 11, une tranche d'entiers est manipulée pour démontrer ses propriétés. Cependant, un constat soulève une question : pourquoi la capacité des tranches change-t-elle dans la dernière ligne, alors qu'elle reste inchangée dans les opérations précédentes ?

Comprendre les effets de la manipulation des tranches sur la capacité

La capacité des tranches fait référence au nombre maximum d'éléments que le tableau sous-jacent peut contenir avant qu'une réallocation ne soit nécessaire. L'extrait de code Go Tour effectue les opérations suivantes :

  1. Création : Une tranche initiale s est créée avec une longueur et une capacité de 6.
  2. Découpage à une longueur nulle : s[:0] crée une nouvelle tranche commençant au début de s et se terminant à l'index 0, effectivement en le tronquant à une longueur nulle. La capacité reste de 6 car aucun élément n'est supprimé du tableau de support.
  3. Extension de la longueur de la tranche : s[:4] étend la tranche pour inclure les quatre premiers éléments. La capacité reste 6 car il y a encore de l'espace dans le tableau de support.
  4. Suppression des deux premières valeurs : s[2:] supprime les deux premiers éléments de s, mais la capacité diminue à 4 . Cela se produit parce que la tranche contient toujours les éléments restants et que la distance entre le début de la tranche (s[2]) et la fin du tableau de support est égale à . diminué.

Raisons de la réduction de capacité dans la dernière ligne

  • Mouvement du pointeur de données de tranche : Suppression des deux premières elements déplace le pointeur de données de tranche de deux positions vers la droite. Cela réduit efficacement la distance entre le début de la tranche et la fin du tableau de support.
  • Aucun impact sur le tableau de support : Toutes les opérations de tranche modifient uniquement l'en-tête de la tranche, pas le tableau de support. . Le tableau de sauvegarde reste inchangé, avec une capacité de 6.

Visualisation des modifications d'en-tête

Le code suivant imprime l'en-tête de tranche, qui fournit des informations supplémentaires sur les changements :

<code class="go">func printSlice(s []int) {
    sh := (*reflect.SliceHeader)(unsafe.Pointer(&s))
    fmt.Printf("header=%+v len=%d cap=%d %v\n", sh, len(s), cap(s), s)
}</code>

La sortie montre que le pointeur de données d'en-tête se déplace de 272990208 à 272990216 lorsque les deux premiers éléments sont supprimés, réduisant ainsi la capacité de la tranche.

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