Maison  >  Article  >  développement back-end  >  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
Mary-Kate Olsenoriginal
2024-11-12 19:54:02641parcourir

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!")
}

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?
}

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
}

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