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
Libérer: 2024-12-09 15:18:15
original
854 Les gens l'ont consulté

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)
}
Copier après la connexion

Ce code entraînera une erreur du compilateur :

cannot use value (type []string) as type []Card in argument to NewHand
Copier après la connexion

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)
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal