„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Warum gibt die Funktion „reflect.MakeSlice“ einen nicht adressierbaren Wert zurück?

Warum gibt die Funktion „reflect.MakeSlice“ einen nicht adressierbaren Wert zurück?

Veröffentlicht am 10.11.2024
Durchsuche:395

Why is the `reflect.MakeSlice` Function Returning an Un-Addressable Value?

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.

Neuestes Tutorial Mehr>

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