Когда мы действительно проверим исходный код стандартной библиотеки Go, мы увидим, где на goto
самом деле хорошо применены s.
Например, в math/gamma.go
файле используется goto
инструкция :
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)
}
В goto
этом случае мы избавляемся от введения другой (логической) переменной, используемой только для потока управления, проверяемой в конце. В этом случае , то goto
оператор делает код на самом деле лучше читать и легче последующей (вполне в отличие от аргумента против goto
вы упомянули).
Также обратите внимание, что этот goto
оператор имеет очень специфический вариант использования. В спецификации языка goto указано, что он не может перепрыгивать через переменные, входящие в область видимости (объявляемые), и не может переходить в другие (кодовые) блоки.