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
Patricia ArquetteOriginal
2024-11-07 21:56:03986Durchsuche

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)

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

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

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!

Stellungnahme:
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