Maison > développement back-end > Golang > Instruction de retour manquante dans la boucle for conditionnelle

Instruction de retour manquante dans la boucle for conditionnelle

PHPz
Libérer: 2024-02-09 12:30:09
avant
827 Les gens l'ont consulté

带条件的 for 循环中缺少 return 语句

En PHP, la boucle for est une structure d'itération courante utilisée pour exécuter à plusieurs reprises un morceau de code. Cependant, nous pouvons parfois oublier d'ajouter une instruction return dans une boucle for conditionnelle, ce qui empêchera le programme de renvoyer les résultats normalement. Dans ce cas, l'éditeur PHP Yuzai recommande de vérifier le code à temps pour s'assurer que les instructions de retour appropriées sont ajoutées à la boucle afin d'éviter des erreurs inattendues. Cela peut garantir la fiabilité et l'exactitude du code et améliorer l'efficacité et la maintenabilité du programme.

Contenu de la question

J'ai remarqué que lorsque j'écris le code suivant, le compilateur produit missing return statements 错误 :

// Similar loops make sense in retry patterns
// but this is just a simple example
func TestMethod() int {
    for i := 0; i < 10; i++ {
        return 0
    }
}
Copier après la connexion

C'est à ce moment-là que ce qui suit est compilé sans aucune erreur :

func TestMethod() int {
    for {
        return 0
    }
}
Copier après la connexion

Le premier code est logiquement et techniquement correct car il est impossible que la méthode échoue à revenir. Y a-t-il une raison pour laquelle le compilateur affiche cette erreur ? Ou s'agit-il d'une sorte de logique manquante ou d'un bug ?

Solution de contournement

En développant le commentaire de @Cerise Limón dans une réponse, l'affirmation selon laquelle "le premier code... est techniquement correct" est fausse.

La spécification du langage Go dit ceci :

Aussiet ceci :

(c'est moi qui souligne)

En inspectant le code dans la première fonction, nous pouvons voir que ces conditions de la spécification ne sont pas remplies :

func TestMethod() int {
    for i:= 0; i < 10; i++ {
        return 0
    }
}
Copier après la connexion

La fonction a un paramètre de résultat (int 返回值),因此必须以终止语句结束,但该函数的最终语句是 for instruction avec une condition , c'est-à-dire que n'est pas une "instruction de fin" telle que définie par la spécification.

Cela peut paraître bizarre, mais c'est en fait techniquement correct.

Matériaux bonus

Alors pourquoi la deuxième fonction est-elle correcte ?

func TestMethod() int {
    for {
        return 0
    }
}
Copier après la connexion

Dans ce cas, l'instruction finale de la fonction est for, où est inconditionnellement et , n'a pas d'instruction break qui fait référence à la boucle for, satisfaisant la définition de spécification du langage d'une instruction de fin.

Il y a une logique dans votre travail.

Si une instruction for 语句包含 break inconditionnelle contient break, la boucle peut se terminer, la fonction nécessite donc une instruction return.

Si l'instruction for 语句包含 break (并且没有 return inconditionnelle

ne contient pas

d'instruction break (et aucune instruction return), la boucle ne se terminera pas (du moins pas à la suite de l'exécution normale path) nécessite une valeur de retour de fonction). break 语句是否可达; 它们只需要存在。例如即使 break

Il convient également de noter qu'il n'y a pas d'analyse de flux de contrôle pour déterminer si des instructions break sont accessibles 🎜elles doivent simplement exister🎜 ; Par exemple, ce qui suit déclenchera une erreur de compilation « retour manquant » même si break est clairement inaccessible : 🎜
func foo() int {
    for {
        if false {
            break
        }
        return 0
    }
    // <-- error: missing return
}
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!

Étiquettes associées:
source:stackoverflow.com
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal