Maison >développement back-end >Golang >Comment puis-je convertir en toute sécurité une tranche de chaînes en une tranche de types personnalisés dans Go ?

Comment puis-je convertir en toute sécurité une tranche de chaînes en une tranche de types personnalisés dans Go ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-09 15:18:15831parcourir

How Can I Safely Convert a Slice of Strings to a Slice of Custom Types in Go?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn