Maison > Article > développement back-end > Pourquoi « reflect.MakeSlice » renvoie-t-il une valeur non adressable dans Go ?
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)
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) }
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.
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!