Heim > Artikel > Backend-Entwicklung > Warum ist ein mit „reflect.MakeSlice' erstelltes Slice nicht adressierbar?
In Go bezieht sich Adressierbarkeit auf die Fähigkeit, die Speicheradresse einer Variablen zu erhalten und deren Gültigkeit zu garantieren . Lokale Stapelvariablen sind nicht adressierbar und dieses Konzept gilt für Werte, die mit „reflect.MakeSlice“ erstellt wurden.
Bei Verwendung von „reflect.MakeSlice“ erstellen Sie einen neuen Slice-Wert. Dieser Wert wird jedoch nicht an einem Speicherort mit bekannter Adresse gespeichert. Stattdessen existiert es vorübergehend auf dem Stapel. Dieser vom Stapel zugewiesene Wert kann nicht zum Erstellen eines Zeigers auf einen Slice verwendet werden, da die Adresse ungültig werden würde, wenn der Stapelrahmen zerstört wird.
Um dieses Problem zu beheben und Um einen adressierbaren Slice-Wert zu erhalten, können Sie „reflect.New()“ verwenden. Diese Funktion erstellt einen Zeiger auf das Slice:
myType := reflect.TypeOf(my) slice := reflect.MakeSlice(reflect.SliceOf(myType), 10, 10) x := reflect.New(slice.Type()).Elem() x.Set(slice)
Der x.Elem()-Aufruf dereferenziert den Zeiger und gibt den tatsächlichen Slice-Wert zurück, der nun zur Übergabe an die All()-Methode verwendet werden kann.
Gemäß der Go-Sprachspezifikation ist ein Wert adressierbar, wenn er:
Im Fall von Reflect.MakeSlice das neu erstellte Slice erfüllt keines dieser Kriterien, da es auf dem Stapel vorhanden ist und nicht an einem permanenten Speicherort gespeichert ist.
Das obige ist der detaillierte Inhalt vonWarum ist ein mit „reflect.MakeSlice' erstelltes Slice nicht adressierbar?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!