Khi chúng tôi thực sự kiểm tra mã nguồn của thư viện tiêu chuẩn Go, chúng tôi có thể thấy những nơi goto
chúng thực sự được áp dụng tốt.
Ví dụ, trong các math/gamma.go
tập tin, các goto
tuyên bố là đã qua sử dụng :
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)
}
Trong goto
trường hợp này, chúng ta không phải đưa vào một biến (boolean) khác chỉ được sử dụng cho luồng điều khiển, được kiểm tra ở cuối. Trong trường hợp này , goto
câu lệnh làm cho mã thực sự tốt hơn để đọc và dễ theo dõi hơn (hoàn toàn trái ngược với lập luận chống lại goto
bạn đã đề cập).
Cũng lưu ý rằng goto
câu lệnh có một trường hợp sử dụng rất cụ thể. Đặc tả ngôn ngữ trên goto nói rằng nó có thể không nhảy qua các biến sắp vào phạm vi (đang được khai báo) và nó không thể nhảy vào các khối (mã-) khác.