Maison > développement back-end > Golang > le corps du texte

Pourquoi une tranche créée avec « reflect.MakeSlice » n'est-elle pas adressable ?

Patricia Arquette
Libérer: 2024-11-12 08:13:02
original
503 Les gens l'ont consulté

Why is a Slice Created with `reflect.MakeSlice` Not Addressable?

Pourquoi Reflect.MakeSlice renvoie-t-il une valeur non adressable ?

En Go, l'adressabilité fait référence à la capacité d'obtenir l'adresse mémoire d'une variable et de garantir sa validité . Les variables de pile locale ne sont pas adressables et ce concept s'applique aux valeurs créées à l'aide de Reflect.MakeSlice.

Lors de l'utilisation de Reflect.MakeSlice, vous créez une nouvelle valeur de tranche. Cependant, cette valeur n'est pas stockée dans un emplacement mémoire avec une adresse connue. Au lieu de cela, il existe temporairement sur la pile. Cette valeur allouée par la pile ne peut pas être utilisée pour créer un pointeur vers une tranche, car l'adresse deviendrait invalide lorsque le cadre de pile serait détruit.

Obtention d'une valeur de tranche adressable

Pour résoudre ce problème et Pour obtenir une valeur de tranche adressable, vous pouvez utiliser Reflect.New(). Cette fonction crée un pointeur vers la tranche :

myType := reflect.TypeOf(my)
slice := reflect.MakeSlice(reflect.SliceOf(myType), 10, 10)
x := reflect.New(slice.Type()).Elem()
x.Set(slice)
Copier après la connexion

L'appel x.Elem() déréférence le pointeur et renvoie la valeur réelle de la tranche, qui peut maintenant être utilisée pour passer à la méthode All().

Comprendre l'adressabilité en Go

Selon la spécification du langage Go, une valeur est adressable si elle est :

  • Un élément d'une tranche
  • Un élément d'un tableau adressable
  • Un champ d'une structure adressable
  • Le résultat du déréférencement d'un pointeur

Dans le cas de Reflect.MakeSlice, le nouveau créé slice ne répond à aucun de ces critères car il existe sur la pile et n'est pas stocké dans un emplacement mémoire permanent.

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