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

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

Patricia Arquette
Freigeben: 2024-11-07 21:56:03
Original
996 Leute haben es durchsucht

Why Does `reflect.MakeSlice` Return an Un-addressable Value in Go?

Warum Reflect.MakeSlice in Go einen nicht adressierbaren Wert zurückgibt

Problemübersicht

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

Erhalten eines Zeigers auf ein Slice mithilfe von Reflection

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

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

Warum Reflect.MakeSlice nicht adressierbare Werte zurückgibt

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.

Warum ein Zeiger auf ein Slice erforderlich ist

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!

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