Die Unfähigkeit, Slices unterschiedlicher Typen zu konvertieren, wie im bereitgestellten Code-Snippet veranschaulicht, ist auf eine bestimmte Typkonvertierung zurückzuführen Regeln, die in der Go-Spezifikation beschrieben sind. Diese Regeln regeln, wann ein nicht konstanter Wert in einen bestimmten Typ konvertiert werden kann.
Keine der Konvertierungsregeln gilt für den Fall, dass Sie versuchen, einen Abschnitt von Bar in einen Abschnitt von Foo umzuwandeln. Während die zugrunde liegenden Typen von Foo und Bar identisch sind, ist dies bei den zugrunde liegenden Typen ihrer jeweiligen Slices nicht der Fall. Dies führt dazu, dass einer Variablen vom Typ []Bar kein []Foo-Wert zugewiesen werden kann.
Die Basistypen verstehen
Es ist wichtig zu beachten, dass der Basiswert Der Typ einer Variablen ist nicht unbedingt derselbe wie der Typ der Variablen selbst. Bei Slices ist der Elementtyp der zugrunde liegende Typ. Während also Foo und Bar denselben zugrunde liegenden Typ haben (Foo), ist dies bei []Foo und []Bar nicht der Fall.
Eine praktische Lösung
Um dieses Problem anzugehen können Sie einen Zwischentyp erstellen, der Bar als Foo bezeichnet. Dieser Ansatz funktioniert, weil der Elementtyp des Slice gleich bleibt. Zum Beispiel:
type Foo struct { A int }
type Bar Foo
type Foos []Foo
type Bars Foos
func main() {
foos := []Foo{Foo{1}, Foo{2}}
bars := Bars(foos)
fmt.Println(bars)
}
Ausgabe:
[{1} {2}]
Diese Lösung erstellt Slices mit demselben zugrunde liegenden Elementtyp und ermöglicht die Konvertierung zwischen ihnen.
Unsichere Überlegungen
Als Vorsichtsmaßnahme: Während es technisch möglich ist, einen Teil von Foo mithilfe unsicherer Vorgänge als Teil von Bar zu „ansehen“, umgeht dieser Ansatz die Typsicherheit. Aus Sicherheits- und Zuverlässigkeitsgründen wird empfohlen, den oben beschriebenen Typ-Aliasing-Ansatz zu verwenden.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3