Maison  >  Article  >  développement back-end  >  Pourquoi ne pouvez-vous pas convertir des tranches de différents types dans Go ?

Pourquoi ne pouvez-vous pas convertir des tranches de différents types dans Go ?

DDD
DDDoriginal
2024-10-31 16:40:30728parcourir

Why Can't You Convert Slices of Different Types in Go?

Pourquoi ne pouvez-vous pas convertir les types de tranches ?

L'incapacité de convertir des tranches de différents types, comme l'illustre l'extrait de code fourni, est due à une conversion de type spécifique. règles décrites dans la spécification Go. Ces règles régissent le cas où une valeur non constante peut être convertie en un type spécifique.

Aucune des règles de conversion ne s'applique au cas où vous tentez de convertir une tranche de Bar en une tranche de Foo. Bien que les types sous-jacents de Foo et Bar soient identiques, les types sous-jacents de leurs tranches respectives ne le sont pas. Cela entraîne l'impossibilité d'attribuer une valeur []Foo à une variable de type []Bar.

Comprendre les types sous-jacents

Il est crucial de noter que le sous-jacent le type d’une variable n’est pas nécessairement le même que le type de la variable elle-même. Dans le cas des tranches, le type d'élément est le type sous-jacent. Ainsi, alors que Foo et Bar ont le même type sous-jacent (Foo), []Foo et []Bar n'en ont pas.

Une solution pratique

Pour résoudre ce problème , vous pouvez créer un type intermédiaire qui alias Bar comme Foo. Cette approche fonctionne car le type d'élément de la tranche reste le même. Par exemple :

<code class="go">type Foo struct { A int }
type Bar Foo

type Foos []Foo
type Bars Foos

func main() {
    foos := []Foo{Foo{1}, Foo{2}}
    bars := Bars(foos)

    fmt.Println(bars)
}</code>

Sortie :

[{1} {2}]

Cette solution crée des tranches avec le même type d'élément sous-jacent, permettant la conversion entre elles.

Considérations dangereuses

Par mesure de prudence, bien qu'il soit techniquement possible de « visualiser » une tranche de Foo comme une tranche de Bar en utilisant des opérations non sécurisées, cette approche contourne la sécurité de type. Il est recommandé d'utiliser l'approche d'alias de type décrite ci-dessus pour des raisons de sécurité et de fiabilité.

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