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
Linda HamiltonOriginal
2024-12-03 14:36:12776Durchsuche

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)
}

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

cannot use value (type []string) as type []Card in argument to NewHand

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)

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!

Stellungnahme:
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