J'ai été surpris de constater que Go a une déclaration «goto» . On m'a toujours appris que les déclarations «goto» sont une chose du passé et du mal car elles obstruent le flux réel d'un programme, et que les fonctions ou méthodes sont toujours un meilleur moyen de contrôler le flux.
J'ai dû louper quelque chose. Pourquoi Google l'a-t-il inclus?
goto
est utile dans certains cas. Lisez après avoir étudié la réponse de @ Kissaki.Réponses:
Lorsque nous vérifions le code source de la bibliothèque standard Go, nous pouvons voir où les
goto
s sont réellement bien appliqués.Par exemple, dans le
math/gamma.go
fichier, l'goto
instruction est utilisée :Le
goto
dans ce cas nous évite d'introduire une autre variable (booléenne) utilisée uniquement pour le flux de contrôle, vérifiée à la fin. Dans ce cas , l'goto
instruction rend le code en fait meilleur à lire et à suivre plus facilement (tout à fait contrairement à l'argument contregoto
vous mentionné).Notez également que le
goto
déclaration a un cas d'utilisation très spécifique. La spécification du langage sur goto indique qu'il ne peut pas sauter par-dessus les variables entrant dans la portée (en cours de déclaration), et il ne peut pas sauter dans d'autres blocs (de code).la source
small(x,z)
à appeler à la place? De cette façon, nous n'avons pas à penser aux variables accessibles dans l'small:
étiquette. Je soupçonne que la raison en est que go manque encore de certains types de support inlining dans le compilateur.goto
de pointer vers une étiquette après l'introduction de nouvelles variables. L'exécution de l'instruction "goto" ne doit pas faire entrer dans la portée des variables qui n'étaient pas déjà dans la portée au point de goto.Goto est une bonne idée lorsqu'aucune des fonctionnalités de contrôle intégrées ne fait tout ce que vous voulez et lorsque vous pouvez exprimer ce que vous voulez avec un goto. (C'est dommage dans ces cas dans certaines langues lorsque vous n'avez pas de goto. Vous finissez par abuser de certaines fonctionnalités de contrôle, en utilisant des indicateurs booléens ou en utilisant d'autres solutions pires que goto.)
Si une autre fonction de contrôle (utilisée de manière raisonnablement évidente) peut faire ce que vous voulez, vous devriez l'utiliser de préférence à goto. Sinon, soyez audacieux et utilisez goto!
Enfin, il convient de noter que Go's goto a quelques restrictions conçues pour éviter certains bugs obscurs. Voir ces restrictions dans la spécification.
la source
Les déclarations Goto ont reçu beaucoup de discrédit depuis l'ère du code Spaghetti dans les années 60 et 70. À l'époque, la méthodologie de développement de logiciels était très médiocre ou nulle. Cependant Goto n'est pas nativement mauvais mais peut bien sûr être mal utilisé et abusé par des programmeurs paresseux ou non qualifiés. De nombreux problèmes avec Gotos abusés peuvent être résolus avec des processus de développement tels que les révisions de code d'équipe.
goto
sont des sauts de la même manière technique quecontinue
,break
etreturn
. On pourrait soutenir que ces déclarations sont mauvaises de la même manière, mais elles ne le sont pas.La raison pour laquelle l'équipe Go a inclus Gotos est probablement due au fait qu'il s'agit d'une primitive de contrôle de flux commune. En outre, ils ont conclu, espérons-le, que la portée de Go exclut de rendre un langage sans danger pour les idiots impossible à abuser.
la source
continue
,,break
etreturn
sont très différents dans une clé particulière: ils spécifient seulement "quitter la portée englobante". Non seulement ils encouragent, mais exigent explicitement que le développeur considère la structure de son code et s'appuie sur des primitives de programmation structurées (pour les boucles, les fonctions et les instructions de commutation). La seule et unique grâce desgoto
instructions est qu'elles vous permettent d'écrire un assembly dans un HLL lorsque l'optimiseur du compilateur n'est pas à la hauteur de la tâche, mais cela se fait au détriment de la lisibilité et de la maintenabilité.setjmp
,longjmp
,goto
ettry / except / finally
ils ont choisi de pécher par excès de prudence.goto
, fwict, est le seul acquiescement au flux de contrôle pré- "programmation structurée".