Maison > développement back-end > Golang > Comment les Go Slices interagissent-elles avec leurs tableaux sous-jacents ?

Comment les Go Slices interagissent-elles avec leurs tableaux sous-jacents ?

Linda Hamilton
Libérer: 2024-12-07 17:02:12
original
625 Les gens l'ont consulté

How Do Go Slices Interact with Their Underlying Arrays?

Dévoilement du mystère des tableaux sous-jacents Slice dans Go

Dans le domaine de la programmation Go, les tranches agissent comme un moyen flexible de gérer des collections de données sans avoir besoin de longueurs préfixées. Ils fournissent un mécanisme dynamique pour accéder à une séquence contiguë d’éléments. Cependant, lorsque l'on travaille avec des tranches, il est souvent essentiel de comprendre le tableau sous-jacent auquel elles font référence.

Considérons ce scénario : nous avons un tableau d'entiers de longueur 3 :

nums := [3]int{1, 2, 3}
Copier après la connexion

Créer une tranche en découpant les deux premiers éléments :

numSlice := nums[:2]
Copier après la connexion

Dans ce cas, le plafond de numSlice et de nums est de 3, indiquant le sous-jacent capacité du tableau, tandis que len est respectivement de 2 et 3. Maintenant, si nous ajoutons un élément à numSlice :

numSlice = append(numSlice, 10)
Copier après la connexion

Le tableau sous-jacent nums devient [1 2 10], indiquant que numSlice fait toujours référence au tableau d'origine. La capacité reste de 3 pour numSlice et len.

Cependant, lors de la deuxième opération d'ajout :

numSlice = append(numSlice, 20)
Copier après la connexion

Le tableau sous-jacent de numSlice doit changer car sa capacité est atteinte. Ce nouveau tableau sous-jacent se reflète dans la capacité doublée et dans une lentille mise à jour de 4 pour numSlice.

Récupération de la référence au nouveau tableau

Pour accéder au sous-jacent nouvellement créé array, nous pouvons exploiter la combinaison de packages réfléchissants et non sécurisés dans Go. La structure Reflect.SliceHeader fournit un champ nommé Data, qui contient un pointeur vers le tableau sous-jacent d'une tranche.

s := []int{1, 2, 3, 4}
hdr := (*reflect.SliceHeader)(unsafe.Pointer(&s))
data := *(*[4]int)(unsafe.Pointer(hdr.Data))
Copier après la connexion

En utilisant cette technique, vous pouvez accéder et manipuler directement le tableau sous-jacent, vous offrant ainsi des informations plus approfondies. contrôle sur la gestion des données dans vos programmes Go.

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