Heim > Backend-Entwicklung > Golang > Warum kann ich in Go nicht direkt zwischen Slices verschiedener Typen konvertieren?

Warum kann ich in Go nicht direkt zwischen Slices verschiedener Typen konvertieren?

Linda Hamilton
Freigeben: 2024-12-03 14:36:12
Original
768 Leute haben es durchsucht

Why Can't I Directly Convert Between Slices of Different Types in Go?

Typkonvertierungseinschränkungen in Go

Go erzwingt strenge Typisierungsregeln, die scheinbar offensichtliche Konvertierungen zwischen Slices unterschiedlicher Typen, die denselben zugrunde liegenden Typ enthalten, verhindern können Elemente. Diese Einschränkung wird im folgenden Code deutlich:

package main

import "fmt"

type Card string
type Hand []Card

func NewHand(cards []Card) Hand {
    hand := Hand(cards)
    return hand
}

func main() {
    value := []string{"a", "b", "c"}
    firstHand := NewHand(value)
    fmt.Println(firstHand)
}
Nach dem Login kopieren

Trotz der Ähnlichkeit zwischen []string und []Card meldet der Compiler einen Fehler:

cannot use value (type []string) as type []Card in argument to NewHand
Nach dem Login kopieren

Begründung

Die Go-Spezifikation verbietet diese Konvertierung, um versehentliche Typkonvertierungen zwischen nicht verwandten Typen zu verhindern, die zufällig dasselbe gemeinsam haben Struktur.

Lösungen

  • Sicheres Kopieren: Der empfohlene Ansatz besteht darin, den Inhalt des Slice in den gewünschten Typ zu kopieren.
  • Unsichere Zeigerkonvertierung (Unsicher): Diese Technik umgeht das Typsystem und ermöglicht die direkte Konvertierung mithilfe von unsicheres Paket, aber es sollte mit Vorsicht verwendet werden.
value := []string{"a", "b", "c"}
cards := *(*[]Card)(unsafe.Pointer(&value))
firstHand := NewHand(cards)
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWarum kann ich in Go nicht direkt zwischen Slices verschiedener Typen konvertieren?. 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