1. 程式人生 > 其它 >golang 使用goto進行多錯誤處理

golang 使用goto進行多錯誤處理

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,彙總所有流程,進行錯誤列印並退出程序。