Heim >Backend-Entwicklung >Golang >Warum gibt „reflect.MakeSlice' in Go einen nicht adressierbaren Wert zurück?
In Go gibt die Verwendung von Reflect.MakeSlice zum Erstellen eines Slice einen zurück nicht adressierbarer Wert. Dies wird zu einem Problem, wenn eine Slice-Adresse erforderlich ist, wie im folgenden Codeausschnitt gezeigt:
collection.Find(bson.M{}).All(&result)
Um dieses Problem zu beheben, gibt es zwei Lösungen:
1. Verwenden von „reflect.New()“
Die einfachste Lösung besteht darin, „reflect.New()“ zum Erstellen eines Zeigers zu verwenden. Zum Beispiel:
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. Verwenden einer typisierten Karte
Alternativ können Sie eine typisierte Karte verwenden, um ein Segment des gewünschten Typs zu erstellen:
type MyStructList map[string]*MyStruct myMap := reflect.New(reflect.MapOf(myKey, myValue)) for _, value := range myMap.MapKeys() { myValue := myMap.MapIndex(value) }
Lokale Stack-Variablen, einschließlich der von Reflect.MakeSlice erstellten, können in Go nicht adressiert werden. Dadurch wird sichergestellt, dass Zeiger auf diese Variablen sinnvoll bleiben und nicht auf ungültige Speicherorte verweisen.
Die MGO-API benötigt für ihren Iter einen Zeiger auf ein Slice .All funktioniert, da durch das Anhängen an ein Slice möglicherweise Speicher neu zugewiesen wird. Um diese Änderungen dem Anrufer mitzuteilen, ist ein Zeiger erforderlich.
Das obige ist der detaillierte Inhalt vonWarum gibt „reflect.MakeSlice' in Go einen nicht adressierbaren Wert zurück?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!