Heim > Backend-Entwicklung > Golang > Warum gibt „reflect.MakeSlice' einen nicht adressierbaren „Wert' zurück?

Warum gibt „reflect.MakeSlice' einen nicht adressierbaren „Wert' zurück?

Barbara Streisand
Freigeben: 2024-11-08 05:36:01
Original
1092 Leute haben es durchsucht

Why does `reflect.MakeSlice` return an un-addressable `Value`?

Warum gibt Golang Reflect.MakeSlice einen nicht adressierbaren Wert zurück?

Diese Frage ergibt sich aus der Notwendigkeit, eine Slice-Adresse zur Verwendung in einer Funktion zu erstellen, die a akzeptiert Zeiger auf ein Slice.

Warum gibt Reflect.MakeSlice einen nicht adressierbaren Wert zurück?

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.
Nach dem Login kopieren

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).

So erhalten Sie mithilfe von Reflection einen Zeiger auf ein Slice

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())
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage