Typkonvertierung: Strings in benutzerdefinierte Typen
In Go kann die Konvertierung eines Teils von Zeichenfolgen in ein Teil von benutzerdefinierten Typen eine Herausforderung sein. Betrachten Sie das folgende Beispiel:
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) }
Dieser Code führt zu einem Compilerfehler:
cannot use value (type []string) as type []Card in argument to NewHand
Der Grund für diesen Fehler liegt in der Entscheidung des Spezifikationsdesigns, versehentliche Konvertierungen zwischen nicht verwandten Typen zu verhindern die zufälligerweise die gleiche Struktur haben. Unter bestimmten Umständen kann es jedoch erforderlich sein, zwischen solchen Slices zu konvertieren.
Unsichere Konvertierung
Obwohl es technisch nicht unmöglich ist, zwischen Slices mit identischen zugrunde liegenden Typen zu konvertieren , besteht der sichere Ansatz darin, das Slice zu kopieren. Dennoch ist es möglich, eine direkte Konvertierung (ohne Kopieren) mit dem unsicheren Paket durchzuführen:
value := []string{"a", "b", "c"} // convert &value (type *[]string) to *[]Card via unsafe.Pointer, then deref cards := *(*[]Card)(unsafe.Pointer(&value)) firstHand := NewHand(cards)
Vorsicht
Die Verwendung des unsicheren Pakets erfordert äußerste Vorsicht ermöglicht es Programmen, das Typsystem zu umgehen und auf beliebigen Speicher zuzugreifen. Wenn die Konvertierung von entscheidender Bedeutung ist, empfiehlt es sich, andere Optionen in Betracht zu ziehen, z. B. die Definition eines neuen Typs, der sowohl den String- als auch den Kartentyp kapselt, und die Durchführung einer sicheren Konvertierung innerhalb dieser Struktur.
Das obige ist der detaillierte Inhalt vonWie kann ich in Go ein Stück Strings sicher in ein Stück benutzerdefinierter Typen konvertieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!