Maison >développement back-end >Golang >Pourquoi ne puis-je pas convertir directement entre des tranches de différents types dans Go ?

Pourquoi ne puis-je pas convertir directement entre des tranches de différents types dans Go ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-03 14:36:12836parcourir

Why Can't I Directly Convert Between Slices of Different Types in Go?

Restrictions de conversion de type dans Go

Go applique des règles de saisie strictes, qui peuvent empêcher des conversions apparemment évidentes entre des tranches de types différents contenant le même sous-jacent éléments. Cette restriction est évidente dans le code 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)
}

Malgré la similitude entre []string et []Card, le compilateur signale une erreur :

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

Raison d'être

La spécification de Go interdit cette conversion pour empêcher les conversions de types accidentelles entre des types non liés qui partagent par hasard le même structure.

Solutions

  • Copie sécurisée : L'approche recommandée consiste à copier le contenu de la tranche dans le type souhaité.
  • Conversion de pointeur non sécurisée (Unsafe) : Cette technique contourne le système de types et permet une conversion directe à l'aide du emballage dangereux, mais il doit être utilisé avec prudence.
value := []string{"a", "b", "c"}
cards := *(*[]Card)(unsafe.Pointer(&value))
firstHand := NewHand(cards)

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