Warum Reflect.MakeSlice einen nicht adressierbaren Wert zurückgibt?
In Go bietet das Reflect-Paket eine Schnittstelle zum Überprüfen und Bearbeiten von Typen und Werten. reflektieren.MakeSlice erstellt ein Slice eines bestimmten Typs. Der zurückgegebene Wert ist jedoch nicht adressierbar. Das bedeutet, dass Sie seine Adresse nicht übernehmen oder einem Zeiger zuweisen können.
Lösung: Verwenden Sie Reflect.New()
Um mithilfe von Reflection ein adressierbares Slice zu erhalten, müssen Sie Sie können die Funktion „reflect.New()“ verwenden, um einen Zeiger auf das Slice zu erstellen. Dies kann wie folgt erfolgen:
// Create the slice type sliceType := reflect.SliceOf(SomeType) // Create a slice using reflect.MakeSlice slice := reflect.MakeSlice(sliceType, 10, 10) // Create a pointer to the slice slicePtr := reflect.New(slice.Type()) // Set the slice pointer to the slice slicePtr.Elem().Set(slice)
Jetzt haben Sie ein adressierbares Slice, das als Argument an Funktionen übergeben werden kann, die einen Slice-Zeiger erfordern.
Warum reflektieren. MakeSlice gibt einen nicht adressierbaren Wert zurück
Lokale Stack-Variablen in Go sind nicht adressierbar, da die Laufzeit sie jederzeit auf den Heap verschieben kann. reflektieren.MakeSlice erstellt eine lokale Slice-Variable, weshalb der zurückgegebene Wert nicht adressierbar ist.
Warum ein Zeiger auf ein Slice erforderlich ist
Einige APIs, z Wie das, das Sie aus dem MGO-Paket erwähnt haben, ist ein Zeiger auf ein Slice als Argument erforderlich. Dies liegt daran, dass beim Anhängen an den Slice möglicherweise ein neuer Slice mit erhöhter Kapazität zugewiesen wird. Wenn Sie ein Nicht-Zeiger-Slice übergeben, sind die am Slice vorgenommenen Änderungen außerhalb der Funktion nicht sichtbar.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3