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
Libérer: 2024-12-03 14:36:12
original
769 Les gens l'ont consulté

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

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

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

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

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