Diese Frage ergibt sich aus der Notwendigkeit, eine Slice-Adresse zur Verwendung in einer Funktion zu erstellen, die a akzeptiert Zeiger auf ein Slice.
Eine lose Definition der Adressierbarkeit in Go ist, dass man die Adresse von etwas übernehmen kann und garantiert ist, dass dies der Fall ist Die Adresse verweist auf einen sinnvollen Ort. Wenn Sie im Hauptteil einer Funktion etwas auf dem Stapel zuweisen, ist die Adresse des zugewiesenen Werts irgendwann nicht mehr zugänglich. Daher ist dieser Wert nicht adressierbar.
In den meisten Fällen verschiebt Go lokale Stack-Variablen auf den Heap, wenn sie zurückgegeben oder auf andere Weise nach außen befördert werden, zur Laufzeit geschieht dies jedoch nicht. Daher gibt CanAddr() nur dann „true“ zurück, wenn:
A value is addressable if it is an element of a slice, an element of an addressable array, a field of an addressable struct, or the result of dereferencing a pointer.
Die angegebenen Typen haben alle eines gemeinsam: Sie garantieren, dass das, was sie enthalten, von überall aus zugänglich ist und auf einen sinnvollen Wert im Speicher verweist. Sie haben weder ein Slice-Element noch einen Zeiger oder eines der anderen genannten Dinge, seit Sie mit Reflect.MakeSlice ein lokales Slice erstellt haben. Die Elemente dieses Slice wären jedoch adressierbar (da sich der Speicher des Slice auf dem Heap befindet).
Die einfachste Lösung ist wahrscheinlich die Verwendung von Reflect .New() zum Erstellen des Zeigers (vollständiges Beispiel im Spiel):
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())
Beachten Sie die x.Interface(), auf die auch in anderen Antworten hingewiesen wurde. Dies verhindert, dass anstelle des Reflect.Value der tatsächliche Wert von x an All() übergeben wird.
Das obige ist der detaillierte Inhalt vonWarum gibt „reflect.MakeSlice' einen nicht adressierbaren „Wert' zurück?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!