Maison  >  Article  >  développement back-end  >  Pourquoi une tranche créée avec « reflect.MakeSlice » n'est-elle pas adressable ?

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

Patricia Arquette
Patricia Arquetteoriginal
2024-11-12 08:13:02513parcourir

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)

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!

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