Maison >développement back-end >Golang >Pourquoi réfléchit.MakeSlice renvoie-t-il une valeur non adressable ?

Pourquoi réfléchit.MakeSlice renvoie-t-il une valeur non adressable ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-10 12:58:14726parcourir

Why does reflect.MakeSlice return an un-addressable value?

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

Obtention d'un pointeur de tranche à l'aide de Reflection

Pour récupérer un pointeur vers une tranche à l'aide de réflexion, utilisez reflex.New() :

my := &My{}
myType := reflect.TypeOf(my)
slice := reflect.MakeSlice(reflect.SliceOf(myType), 10, 10)
x := reflect.New(slice.Type())
x.Elem().Set(slice)

N'oubliez pas d'utiliser x.Interface() pour éviter de transmettre le Reflect.Value au lieu de la valeur réelle de votre fonction.

Comprendre la non-adressabilité dans Reflect.MakeSlice

Une valeur adressable garantit que son adresse pointe vers un emplacement significatif. Les allocations effectuées sur la pile au sein d'une fonction ne garantissent pas cela, elles ne sont donc pas adressables.

reflect.MakeSlice attribue des valeurs à une tranche locale sur le tas sans les adresser en tant qu'éléments de tableaux, de structures ou de pointeurs déréférencés. . Par conséquent, il renvoie une valeur non adressable.

Pourquoi exiger un pointeur de tranche ?

Souvent, dans des fonctions comme iter.All de mgo, les pointeurs sont nécessaires car des tranches sont souvent ajoutées. L'ajout modifie l'adresse mémoire de la tranche, qui doit être communiquée à l'appelant.

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