Conversion de types : chaînes en types personnalisés
Dans Go, convertir une tranche de chaînes en une tranche de types personnalisés peut s'avérer difficile. Prenons l'exemple suivant :
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) }
Ce code entraînera une erreur du compilateur :
cannot use value (type []string) as type []Card in argument to NewHand
La raison de cette erreur réside dans la décision de conception de la spécification visant à empêcher les conversions accidentelles entre des types non liés. qui partagent par hasard la même structure. Cependant, dans certaines circonstances, il peut être nécessaire d'effectuer une conversion entre de telles tranches.
Conversion non sécurisée
Bien qu'il ne soit pas techniquement impossible de convertir entre des tranches avec des types sous-jacents identiques , l'approche sûre consiste à copier la tranche. Néanmoins, il est possible d'effectuer une conversion directe (sans copie) à l'aide du package unsafe :
value := []string{"a", "b", "c"} // convert &value (type *[]string) to *[]Card via unsafe.Pointer, then deref cards := *(*[]Card)(unsafe.Pointer(&value)) firstHand := NewHand(cards)
Attention
L'utilisation du package unsafe nécessite une extrême prudence car il permet aux programmes de contourner le système de types et d'accéder à la mémoire arbitraire. Si la conversion est cruciale, il est conseillé d'envisager d'autres options, telles que définir un nouveau type qui encapsule à la fois les types chaîne et carte et effectuer une conversion sécurisée au sein de cette structure.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!