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


Hi,大家好,我是明哥。

在自己學習 Golang 的這段時間里,我寫了詳細的學習筆記放在我的個人微信公眾號 《Go編程時光》,對於 Go 語言,我也算是個初學者,因此寫的東西應該會比較適合剛接觸的同學,如果你也是剛學習 Go 語言,不防關注一下,一起學習,一起成長。

我的在線博客:http://golang.iswbm.com
我的 Github:github.com/iswbm/GolangCodingTime


Go里的流程控制方法還是挺豐富,整理了下有如下這么多種:

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

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

很難想象在 Go 居然會保留 goto,因為很多人不建議使用 goto,所以在一些編程語言中甚至直接取消了 goto。

我感覺 Go 既然保留,一定有人家的理由,只是我目前還沒感受到。不管怎樣,咱還是照常學習吧。

0. 基本模型

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

goto 后接一個標簽,這個標簽的意義是告訴 Go程序下一步要執行哪里的代碼。

所以這個標簽如何放置,放置在哪里,是 goto 里最需要注意的。

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用法



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM