Maison  >  Article  >  développement back-end  >  Pourquoi « reflect.MakeSlice » renvoie-t-il une valeur non adressable dans Go ?

Pourquoi « reflect.MakeSlice » renvoie-t-il une valeur non adressable dans Go ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-07 21:56:03877parcourir

Why Does `reflect.MakeSlice` Return an Un-addressable Value in Go?

Pourquoi Reflect.MakeSlice renvoie une valeur non adressable dans Go

Aperçu du problème

Dans Go, l'utilisation de Reflect.MakeSlice pour créer une tranche renvoie un Valeur non adressable. Cela devient un problème lorsqu'une adresse de tranche est requise, comme démontré dans l'extrait de code suivant :

collection.Find(bson.M{}).All(&result)

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

Pour résoudre ce problème, il existe deux solutions :

1. Utilisation de Reflect.New()

La solution la plus simple consiste à utiliser Reflect.New() pour créer un pointeur. Par exemple :

my := &My{}

// Create a slice to begin with
myType := reflect.TypeOf(my)
slice := reflect.MakeSlice(reflect.SliceOf(myType), 10, 10)

// Create a pointer to a slice value and set it to the slice
x := reflect.New(slice.Type())
x.Elem().Set(slice)

collection.Find(bson.M{}).All(x.Interface())

2. Utilisation d'une carte typée

Vous pouvez également utiliser une carte typée pour créer une tranche du type souhaité :

type MyStructList map[string]*MyStruct

myMap := reflect.New(reflect.MapOf(myKey, myValue))

for _, value := range myMap.MapKeys() {
    myValue := myMap.MapIndex(value)
}

Pourquoi réfléchir.MakeSlice renvoie des valeurs non adressables

Les variables de pile locales, y compris celles créées par Reflect.MakeSlice, ne sont pas adressables dans Go. Cela garantit que les pointeurs vers ces variables restent significatifs et ne pointent pas vers des emplacements mémoire non valides.

Pourquoi un pointeur vers une tranche est requis

L'API mgo nécessite un pointeur vers une tranche pour son iter .All fonctionne car l’ajout à une tranche peut réallouer de la mémoire. Pour communiquer ces changements à l'appelant, un pointeur est nécessaire.

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