Maison >développement back-end >Golang >Comment puis-je récupérer le tableau sous-jacent d'un Go Slice ?

Comment puis-je récupérer le tableau sous-jacent d'un Go Slice ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-07 20:04:13572parcourir

How Can I Retrieve the Underlying Array of a Go Slice?

Comprendre la récupération d'un tableau sous-jacent à une tranche dans Go

Dans Go, une tranche est une structure de données flexible qui fournit une abstraction sur un tableau. Lorsque vous travaillez avec des tranches, il peut être nécessaire d'accéder au tableau sous-jacent. Cet article explique les mécanismes derrière ce processus et comment récupérer la référence au nouveau tableau.

Considérons une tranche numSlice dérivée d'un tableau nums tel que présenté dans la question d'origine. Par défaut, numSlice et nums partagent le même tableau sous-jacent. Cependant, ce tableau sous-jacent peut changer lorsque la capacité de la tranche est dépassée lors d'opérations telles que l'ajout d'éléments.

Pour accéder au tableau sous-jacent d'une tranche, une combinaison de réflexion et de risque peut être utilisée. Voici comment :

Utiliser Reflect et Unsafe

  • Utilisez Reflect.SliceHeader pour obtenir les métadonnées de la tranche, y compris le pointeur vers le tableau sous-jacent (hdr. Data).
  • Convertissez ce pointeur en pointeur de tableau en utilisant unsafe.Pointer.

Voici un exemple adaptant la documentation Go :

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

Remarque : en raison de l'utilisation de unsafe, il est essentiel de gérer la gestion de la mémoire avec prudence.

Ressources supplémentaires

Pour une compréhension complète des composants internes des tranches, reportez-vous à le billet de blog officiel de Go [ici](https://blog.golang.org/go-slices-usage-and-internals).

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