Pourquoi Go at-il une déclaration “goto”

La langue de Google est une nouvelle langue. J’ai donc été surpris de constater qu’il y avait une déclaration «goto» . On m’a toujours appris que les énoncés «goto» sont une chose du passé et que le mal, car il bloque le stream réel d’un programme. La fonction (ou les méthodes si vous voulez) est toujours un meilleur moyen de contrôler le stream.

J’ai dû louper quelque chose. Pourquoi et quand utiliser «goto» est-il une bonne idée? Ou pourquoi Google l’a-t-il inclus?

Lorsque nous vérifions le code source de Gos ( la bibliothèque standard ), nous pouvons voir où les goto s sont bien appliqués.

Par exemple, dans le fichier math/gamma.go , l’instruction goto est utilisée :

  for x < 0 { if x > -1e-09 { goto small } z = z / x x = x + 1 } for x < 2 { if x < 1e-09 { goto small } z = z / x x = x + 1 } if x == 2 { return z } x = x - 2 p = (((((x*_gamP[0]+_gamP[1])*x+_gamP[2])*x+_gamP[3])*x+_gamP[4])*x+_gamP[5])*x + _gamP[6] q = ((((((x*_gamQ[0]+_gamQ[1])*x+_gamQ[2])*x+_gamQ[3])*x+_gamQ[4])*x+_gamQ[5])*x+_gamQ[6])*x + _gamQ[7] return z * p / q small: if x == 0 { return Inf(1) } return z / ((1 + Euler*x) * x) } 

Dans ce cas, le goto nous évite d'introduire une autre variable (booléenne) utilisée uniquement pour le contrôle de stream, vérifiée à la fin. Dans ce cas , l' goto rend le code plus lisible et plus facile à suivre (contrairement à l'argument contre goto vous avez mentionné).

Notez également que l' goto a un cas d'utilisation très spécifique. La spécification du langage sur goto indique qu'il peut ne pas sauter par-dessus les variables entrant dans la scope (en cours de déclaration), et qu'il ne peut pas sauter dans d'autres blocs (code).

Goto est une bonne idée quand aucune des fonctions de contrôle intégrées ne fait exactement ce que vous voulez, et quand vous pouvez exprimer ce que vous voulez avec un goto. (Dans certains cas, il est dommage que certaines langues ne comportent pas de goto. Vous finissez par abuser de certaines fonctionnalités de contrôle, utiliser des indicateurs booléens ou utiliser d’autres solutions que goto.)

Si une autre fonctionnalité 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, notons que le goto de Go comporte des ressortingctions conçues pour éviter certains bogues obscurs. Voir ces ressortingctions dans la spécification.

Les déclarations de Goto ont reçu beaucoup de discrédit depuis l’époque du code Spaghetti dans les années 60 et 70. À cette époque, la méthodologie de développement logiciel était très mauvaise à nulle. Cependant, Goto n’est pas néfaste mais peut être mal utilisé et abusé par des programmeurs paresseux ou peu 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 que continue , break et return . On pourrait soutenir que ce sont des déclarations qui sont mauvaises de la même manière mais elles ne le sont pas.

Pourquoi l’équipe Go a inclus Gotos est probablement dû au fait qu’il s’agit d’une primitive commune de contrôle de stream. En outre, ils ont conclu que la scope de Go exclut la possibilité d’abuser d’une langue idiote.