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
Linda Hamiltonoriginal
2024-12-07 17:02:12623parcourir

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}

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

numSlice := nums[:2]

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)

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)

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

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!

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