Maison > Article > développement back-end > Pourquoi Fallthrough n'est-il pas autorisé dans le commutateur de type Go ?
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!