Schnittstellen-Slices und Struktur-Arrays in Go
Zuweisen eines Slice von Strukturen ([]MyStruct) in Go zu einem Interface-Slice ([ ]interface{}) ist nicht direkt möglich. Dies liegt daran, dass Strukturen und Schnittstellen unterschiedliche Speicherdarstellungen verwenden.
Strukturfelder sind im Speicher zusammenhängend, während Schnittstellen als Typinformationen und Datenpaare gespeichert werden. Dieser Unterschied verhindert eine direkte Konvertierung zwischen den beiden.
Warum die direkte Zuweisung fehlschlägt
Der Compilerfehler beim Versuch, x (ein Stück von Strukturen) y (einer Schnittstelle) zuzuweisen Slice) spiegelt diesen zugrunde liegenden Unterschied wider. Go erfordert Typkompatibilität für Zuweisungen, und die beiden Typen stimmen nicht überein.
Alternativen für den Umgang mit generischen Objektarrays
Obwohl es nicht möglich ist, Strukturarrays Schnittstellen-Slices direkt zuzuweisen , Go bietet mehrere alternative Ansätze für den Umgang mit generischen Objektarrays:
Beispielcode
// Copy Elements Individually var x []MyStruct = [...]MyStruct{{5}, {6}} var y []interface{} for _, v := range x { y = append(y, v) } // Interface Slices var x []MyStruct = [...]MyStruct{{5}, {6}} var y []interface{} = make([]interface{}, len(x)) for i, v := range x { y[i] = v } // Interface Wrapper type MyStructArrayWrapper interface { Get() []MyStruct } type MyStructArrayWrapperImpl struct { array []MyStruct } func (w *MyStructArrayWrapperImpl) Get() []MyStruct { return w.array } x := []MyStruct{MyStruct{5}, MyStruct{6}} var y interface{} = &MyStructArrayWrapperImpl{x}
Das obige ist der detaillierte Inhalt vonWie kann ich einem Interface-Slice ein Go-Slice mit Strukturen zuweisen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!