web-dev-qa-db-fra.com

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

La langue Go de Google est une nouvelle langue. C'est pourquoi j'ai été surpris de constater qu'il a une instruction 'goto' . On m'a toujours enseigné que les déclarations "goto" appartiennent au passé et que le mal car il obstrue le flux réel d'un programme. La fonction (ou les méthodes si vous voulez) est toujours un meilleur moyen de contrôler le flux.

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?

91
harm

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

Par exemple, dans le math/gamma.go fichier, 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)
}

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

Notez également que l'instruction goto a un cas d'utilisation très spécifique. Le 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 qu'il ne peut pas sauter dans d'autres blocs (code-).

70
Kissaki

Goto est une bonne idée lorsqu'aucune des fonctionnalités de contrôle intégrées ne fait exactement 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 d'une manière raisonnablement évidente) peut faire ce que vous voulez, vous devez l'utiliser de préférence à goto. Sinon, soyez audacieux et utilisez goto!

Enfin, il convient de noter que le goto de Go a certaines restrictions conçues pour éviter certains bugs obscurs. Voir ces restrictions dans la spécification

24
Sonia

Les déclarations Goto ont reçu beaucoup de discrédit depuis l'époque de code Spaghetti dans les années 60 et 70. À l'époque, il y avait une méthodologie de développement logiciel très médiocre voire inexistante. 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 que continue, break et return. On pourrait dire que ce sont des déclarations qui 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, espérons-le, conclu que la portée de Go exclut la possibilité de rendre un langage idiot-sûr impossible à abuser.

3
Gustav