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 = &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!