Go 語言 goto 語句
Go 語言的 goto 語句可以無條件地轉(zhuǎn)移到過程中指定的行。
goto語句通常與條件語句配合使用??捎脕韺崿F(xiàn)條件轉(zhuǎn)移, 構(gòu)成循環(huán),跳出循環(huán)體等功能。
但是,在結(jié)構(gòu)化程序設(shè)計中一般不主張使用goto語句, 以免造成程序流程的混亂,使理解和調(diào)試程序都產(chǎn)生困難。
語法
goto 語法格式如下:
goto label
..
.
label: statement
break 語句流程圖如下:
使用 goto 退出多層循環(huán)
下面這段代碼在滿足條件時,需要連續(xù)退出兩層循環(huán),使用傳統(tǒng)的編碼方式如下:
package main
import "fmt"
func main() {
var breakAgain bool
// 外循環(huán)
for x := 0; x < 10; x++ {
// 內(nèi)循環(huán)
for y := 0; y < 10; y++ {
// 滿足某個條件時, 退出循環(huán)
if y == 2 {
// 設(shè)置退出標(biāo)記
breakAgain = true
// 退出本次循環(huán)
break
}
}
// 根據(jù)標(biāo)記, 還需要退出一次循環(huán)
if breakAgain {
break
}
}
fmt.Println("done")
}
將上面的代碼使用Go語言的 goto 語句進(jìn)行優(yōu)化:package main
import "fmt"
func main() {
for x := 0; x < 10; x++ {
for y := 0; y < 10; y++ {
if y == 2 {
// 跳轉(zhuǎn)到標(biāo)簽
goto breakHere
}
}
}
// 手動返回, 避免執(zhí)行進(jìn)入標(biāo)簽
return
// 標(biāo)簽
breakHere:
fmt.Println("done")
}
使用 goto 集中處理錯誤
多處錯誤處理存在代碼重復(fù)時是非常棘手的,例如:
err := firstCheckError()
if err != nil {
fmt.Println(err)
exitProcess()
return
}
err = secondCheckError()
if err != nil {
fmt.Println(err)
exitProcess()
return
}
fmt.Println("done")
在上面代碼中,有一部分都是重復(fù)的錯誤處理代碼,如果后期在這些代碼中添加更多的判斷,就需要在這些雷同的代碼中依次修改,極易造成疏忽和錯誤。
使用 goto 語句來實現(xiàn)同樣的邏輯:
err := firstCheckError()
if err != nil {
goto onExit
}
err = secondCheckError()
if err != nil {
goto onExit
}
fmt.Println("done")
return
onExit:
fmt.Println(err)
exitProcess()
更多建議: