146 votes

Pourquoi Go a-t-il une instruction "goto" ?

J'ai été surpris de constater que Go a un "goto déclaration. On m'a toujours enseigné que les instructions "goto" sont une chose du passé et un mal, car elles masquent le flux réel d'un programme, et que les fonctions ou les méthodes sont toujours un meilleur moyen de contrôler le flux.

Je dois manquer quelque chose. Pourquoi Google l'a-t-il inclus ?

100voto

Kissaki Points 4000

Lorsque nous vérifions le code source de la bibliothèque standard de Go, nous pouvons voir où goto sont en fait bien appliquées.

Par exemple, dans le math/gamma.go fichier, le site goto La déclaration 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)
}

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

Notez également que le goto a un cas d'utilisation très spécifique. Le site spécification du langage sur goto stipule qu'il ne peut pas sauter par-dessus des variables entrant dans le champ d'application (en cours de déclaration), et qu'il ne peut pas sauter dans d'autres blocs (de code).

38voto

Sonia Points 6077

Le goto est une bonne idée lorsque aucune des fonctions de contrôle intégrées ne fait tout à fait ce que vous voulez, et lorsque vous pouvez exprimer ce que vous voulez avec un goto. (C'est une honte dans ces cas-là, dans certains langages, de ne pas avoir de goto. Vous finissez par abuser d'une fonctionnalité de contrôle, utiliser des drapeaux booléens, ou utiliser d'autres solutions pires que goto).

Si une autre fonction de contrôle (utilisée d'une 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 le goto de Go comporte certaines restrictions destinées à éviter certains bogues obscurs. Voir ces restrictions dans la spécification .

12voto

Gustav Points 1314

Les déclarations de Goto ont reçu beaucoup de discrédit depuis l'ère de la Code spaghetti dans les années 60 et 70. À l'époque, la méthodologie de développement logiciel était très pauvre, voire inexistante. Cependant, les Gotos ne sont pas nativement mauvais, mais ils peuvent bien sûr être utilisés à mauvais escient par des programmeurs paresseux ou non qualifiés. De nombreux problèmes liés à l'utilisation abusive des Gotos peuvent être résolus grâce à des processus de développement tels que les revues de code en équipe.

goto sont des sauts de la même manière technique que continue , break y return . On pourrait dire que ces déclarations sont mauvaises de la même manière, mais ce n'est pas le cas.

Les raisons pour lesquelles l'équipe Go a inclus Gotos sont probablement dues au fait qu'il s'agit d'une primitive de contrôle de flux commune. De plus, l'équipe a conclu que la portée de Go excluait la création d'un langage sûr pour les idiots et ne permettant pas d'abus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X