golang 使用goto進行多錯誤處理
阿新 • • 發佈:2021-09-15
goto 語句介紹
在 Go 語言中,可以通過goto
語句跳轉到標籤,進行程式碼間的無條件跳轉。另外,goto
語句在快速跳出迴圈、避免重複退出方面可以簡化程式碼實現過程,但在結構化程式設計中一般不主張使用goto
語句,以免造成程式流程的混亂,使理解和除錯程式都產生困難。
語法
goto label;
..
.
label: statement;
goto 語句流程圖如下:
例項
在滿足條件時,連續退出兩層迴圈,傳統編碼方式如下:
func main() { var isBreak bool for x := 0; x < 20; x++ { // 外迴圈 for y := 0; y < 20; y++ { // 內迴圈 if y == 2 { // 當y等於2時 isBreak = true // 設定退出標記 break // 退出內層迴圈 } } if isBreak { // 根據標記退出外層迴圈 break } } fmt.Println("over") }
將上面的程式碼使用 goto
語句進行優化:
func main() {
for x := 0; x < 20; x++ {
for y := 0; y < 20; y++ {
if y == 2 {
goto breakTag // 跳轉到標籤
}
}
}
return
breakTag: // 標籤
fmt.Println("123")
}
在以上程式碼中,使用 goto 語句 goto breakTag
跳轉到指定的自定義的標籤 breakTag
處,在定義 breakTag
標籤之前有個 return
語句,此處如果不手動返回,則在不滿足條件時也會執行 breakTag
多錯誤處理
在日常開發中,經常會遇到多錯誤處理問題,在多錯誤處理中往往存在程式碼重複的問題。例如:
func main() {
// 省略前面程式碼
err := getUserInfo()
if err != nil {
fmt.Println(err)
exitProcess()
return
}
err = getEmail()
if err != nil {
fmt.Println(err)
exitProcess()
return
}
fmt.Println("over")
}
在上面程式碼中,處理錯誤時,有一部分程式碼都是重複的。如果後期需要在這些程式碼中新增更多的判斷條件,則需要在這些先相同的程式碼中重複修改,很容易造成疏忽和錯誤。這時可以通過 goto
func main() {
// 省略前面程式碼
err := getUserInfo()
if err != nil {
goto doExit
}
err = getEmail()
if err != nil {
goto doExit
}
fmt.Println("over")
return
doExit: // 彙總所有流程,進行錯誤列印並退出程序
fmt.Println(err)
exitProcess()
}
以上程式碼在發生錯誤時,將統一跳轉到自定義錯誤標籤 doExit
,彙總所有流程,進行錯誤列印並退出程序。