Heim > Backend-Entwicklung > Golang > Wie kann ich einem Interface-Slice ein Go-Slice mit Strukturen zuweisen?

Wie kann ich einem Interface-Slice ein Go-Slice mit Strukturen zuweisen?

Patricia Arquette
Freigeben: 2024-12-01 06:59:10
Original
230 Leute haben es durchsucht

How Can I Assign a Go Slice of Structs to an Interface Slice?

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:

  1. Elemente kopieren Einzeln:Elemente eines Strukturarrays können mithilfe einer Schleife manuell in ein Interface-Slice kopiert werden.
  2. Interface-Slices:Sie können ein Slice von Schnittstellen erstellen, wobei jede Schnittstelle eine enthält einzelnes Strukturobjekt.
  3. Schnittstellen-Wrapper: Ein Schnittstellen-Wrapper kann definiert werden, um den Struktur-Array-Typ darzustellen und zu speichern als Schnittstellenwert.

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

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!

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