„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Warum können Sie in Go keine Slices verschiedener Typen konvertieren?

Warum können Sie in Go keine Slices verschiedener Typen konvertieren?

Veröffentlicht am 16.11.2024
Durchsuche:506

Why Can\'t You Convert Slices of Different Types in Go?

Warum können Sie Slice-Typen nicht konvertieren?

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.

Neuestes Tutorial Mehr>

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