Maison > développement back-end > Golang > Pourquoi Fallthrough n'est-il pas autorisé dans le commutateur de type Go ?

Pourquoi Fallthrough n'est-il pas autorisé dans le commutateur de type Go ?

Mary-Kate Olsen
Libérer: 2024-11-12 19:54:02
original
773 Les gens l'ont consulté

Why is Fallthrough Not Allowed in Go's Type Switch?

Fallthrough dans le commutateur de type : pourquoi pas autorisé ?

Question :

Dans Go, tentative d'utilisation de l'instruction fallthrough dans un commutateur de type génère une erreur. Pourquoi le fallthrough n'est-il pas autorisé dans ce contexte ?

Réponse :

Dans un changement de type, la variable activée change de type en fonction du cas spécifique exécuté. Par exemple, la variable i dans le code suivant a un type qui dépend du cas invoqué :

var x interface{}
switch i := x.(type) {
    case int:
        fmt.Println(i + 1)
    case float64:
        fmt.Println(i + 2.0)
    case bool:
        fallthrough
    case string:
        fmt.Printf("%v", i)
    default:
        fmt.Println("Unknown type. Sorry!")
}
Copier après la connexion

Si le repli était autorisé, comment devrait-il se comporter ? Dans le cas de bool, i est saisi comme bool. Cependant, dans le cas d'une chaîne, i devient typé sous forme de chaîne.

Autoriser la transition nécessiterait soit un morphing de type magique (impossible), soit une ombre variable (sans valeur significative). Prenons l'exemple suivant :

switch i := x.(type) {
    case int:
        // i is an int
        fmt.Printf("%T\n", i); // prints "int"
    case bool:
        // i is a bool
        fmt.Printf("%T\n", i); // prints "bool"
        fallthrough
    case string:
        fmt.Printf("%T\n", i);
        // What is the type here? Should be "string", but what if it falls through from bool?
}
Copier après la connexion

La seule solution possible serait de convertir implicitement les cas suivants en interface{}, mais cela serait déroutant et mal défini.

Si le comportement de vérification de type souhaité pour les expressions de changement de casse est essentiel, il peut être implémenté avec les fonctionnalités existantes :

switch i := x.(type) {
    case bool, string:
        if b, ok := i.(bool); ok {
            // b is a bool
        }
        // i is an interface{} that contains either a bool or a string
}
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