Maison >développement back-end >Golang >Pourquoi l'assertion de type de Go échoue-t-elle avec les alias de type ?

Pourquoi l'assertion de type de Go échoue-t-elle avec les alias de type ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-16 05:47:12324parcourir

Why Does Go's Type Assertion Fail with Type Aliases?

Comment convertir un alias de type dans Go ?

Considérez le code Go suivant :

package main

import "fmt"

type somethingFuncy func(int) bool

func funcy(i int) bool {
    return i%2 == 0
}

func main() {
    var a interface{} = funcy

    _ = a.(func(int) bool)  // Works

    fmt.Println("Awesome -- apparently, literally specifying the func signature works.")

    _ = a.(somethingFuncy)  // Panics

    fmt.Println("Darn -- doesn't get here. But somethingFuncy is the same signature as func(int) bool.")
}

La première assertion de type fonctionne lorsqu'elle est explicitement déclarer le type comme func(int) bool. Cependant, le second utilisant l'alias de type quelque choseFuncy panique.

Explication

Contrairement au casting, les assertions de type dans Go comparent strictement le type réel de la valeur affirmée. Par conséquent, l'alias de type quelque choseFuncy, bien que partageant la même signature que func(int) bool, est considéré comme un type distinct.

Bonus

L'assertion de type est effectuée dans le code suivant, qui simplement compare les types pour l'égalité :

func main() {
    var a interface{} = funcy

    switch v := a.(type) {
    case func(int) bool:
        // Type successfully asserted as func(int) bool
    case somethingFuncy:
        // Type successfully asserted as somethingFuncy
    default:
        // Type assertion failed
    }
}

Cette comparaison échoue lors de l'utilisation de l'alias de type car elle nécessite un type exact match.

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