11. Go 語言流程控制:goto 無條件跳轉

Hi,你們好,我是明哥。git

在本身學習 Golang 的這段時間裏,我寫了詳細的學習筆記放在個人我的微信公衆號 《Go編程時光》,對於 Go 語言,我也算是個初學者,所以寫的東西應該會比較適合剛接觸的同窗,若是你也是剛學習 Go 語言,不防關注一下,一塊兒學習,一塊兒成長。github

個人在線博客:http://golang.iswbm.com
個人 Github:github.com/iswbm/GolangCodingTimegolang


Go裏的流程控制方法仍是挺豐富,整理了下有以下這麼多種:編程

  • if - else 條件語句
  • switch - case 選擇語句
  • for - range 循環語句
  • goto 無條件跳轉語句
  • defer 延遲執行

前面三種,我已經都講過了,今天要講講 goto 的無條件跳轉。數組

很難想象在 Go 竟然會保留 goto,由於不少人不建議使用 goto,因此在一些編程語言中甚至直接取消了 goto。微信

我感受 Go 既然保留,必定有人家的理由,只是我目前還沒感覺到。無論怎樣,咱仍是照常學習吧。編程語言

0. 基本模型

goto 顧言思義,是跳轉的意思。函數

goto 後接一個標籤,這個標籤的意義是告訴 Go程序下一步要執行哪裏的代碼。學習

因此這個標籤如何放置,放置在哪裏,是 goto 裏最須要注意的。3d

goto 標籤;
...
...
標籤: 表達式;

1. 最簡單的示例

goto 能夠打破原有代碼執行順序,直接跳轉到某一行執行代碼。

import "fmt"

func main() {

	goto flag
	fmt.Println("B")
flag:
	fmt.Println("A")

}

執行結果,並不會輸出 B ,而只會輸出 A

A

2. 如何使用?

goto 語句一般與條件語句配合使用。可用來實現條件轉移, 構成循環,跳出循環體等功能。

這邊舉一個例子,用 goto 的方式來實現一個打印 1到5 的循環。

import "fmt"

func main() {
	i := 1
flag:
	if i <= 5 {
		fmt.Println(i)
		i++
		goto flag
	}
}

輸出以下

1
2
3
4
5

再舉個例子,使用 goto 實現 類型 break 的效果。

import "fmt"

func main() {
	i := 1
	for {
		if i > 5 {
			goto flag
		}
		fmt.Println(i)
		i++
	}
flag:
}

輸出以下

1
2
3
4
5

最後再舉個例子,使用 goto 實現 類型 continue的效果,打印 1到10 的全部偶數。

import "fmt"

func main() {
	i := 1
flag:
	for i <= 10 {
		if i%2 == 1 {
			i++
			goto flag
		}
		fmt.Println(i)
		i++
	}
}

輸出以下

2
4
6
8
10

3. 注意事項

goto語句與標籤之間不能有變量聲明,不然編譯錯誤。

import "fmt"
 
func main() {
    fmt.Println("start")
    goto flag
    var say = "hello oldboy"
    fmt.Println(say)
flag:
    fmt.Println("end")
}

編譯錯誤

.\main.go:7:7: goto flag jumps over declaration of say at .\main.go:8:6

系列導讀

01. 開發環境的搭建(Goland & VS Code)

02. 學習五種變量建立的方法

03. 詳解數據類型:****整形與浮點型

04. 詳解數據類型:byte、rune與string

05. 詳解數據類型:數組與切片

06. 詳解數據類型:字典與布爾類型

07. 詳解數據類型:指針

08. 面向對象編程:結構體與繼承

09. 一篇文章理解 Go 裏的函數

10. Go語言流程控制:if-else 條件語句

11. Go語言流程控制:switch-case 選擇語句

12. Go語言流程控制:for 循環語句

13. Go語言流程控制:goto 無條件跳轉

14. Go語言流程控制:defer 延遲調用

15. 面向對象編程:接口與多態

16. 關鍵字:make 和 new 的區別?

17. 一篇文章理解 Go 裏的語句塊與做用域

18. 學習 Go 協程:goroutine

19. 學習 Go 協程:詳解信道/通道

20. 幾個信道死鎖經典錯誤案例詳解

21. 學習 Go 協程:WaitGroup

22. 學習 Go 協程:互斥鎖和讀寫鎖

23. Go 裏的異常處理:panic 和 recover

24. 超詳細解讀 Go Modules 前世此生及入門使用

25. Go 語言中關於包導入必學的 8 個知識點

26. 如何開源本身寫的模塊給別人用?

27. 說說 Go 語言中的類型斷言?

28. 這五點帶你理解Go語言的select用法


相關文章
相關標籤/搜索