網站首頁 編程語言 正文
1、流程控制
流程控制在編程語言中是最偉大的發明了,因為有了它,你可以通過很簡單的流程描述來表達很復雜的邏輯。
流程控制包含分三大類:條件判斷,循環控制和無條件跳轉。
2、if 語句
if 也許是各種編程語言中最常見的了,它的語法概括起來就是:
如果滿足條件就做某事,否則做另一件事。
Go 里面 if 條件判斷語句中不需要括號,如下代碼所示:
if x > 10 { ? ? fmt.Println("x is greater than 10") } else { ? ? fmt.Println("x is less than 10") }
Go 的 if 還有一個強大的地方就是條件判斷語句里面允許聲明一個變量,這個變量的作用域,只能在該條件邏輯塊內,其他地方就不起作用了如下所示:
// 計算獲取值 x,然后根據 x 返回的大小,判斷是否大于 10。 if x := computedValue(); x > 10 { ? ? fmt.Println("x is greater than 10") } else { ? ? fmt.Println("x is less than 10") } //這個地方如果這樣調用就編譯出錯了,因為 x 是條件里面的變量 fmt.Println(x)
多個條件的時候如下所示:
if count == 3 { ? ? fmt.Println("The count is equal to 3") } else if count < 3 { ? ? fmt.Println("The count is less than 3") } else { ? ? fmt.Println("The count is greater than 3") }
3、goto
Go 有 goto 語句——請明智地使用它。用 goto 跳轉到必須在當前函數內定義的標簽。
例如假設這樣一個循環:
func myFunc() { i := 0 Here: //這行的第一個詞,以冒號結束作為標簽 println(i) i++ goto Here //跳轉到 Here 去 }
標簽名是大小寫敏感的。
4、for語句
Go 里面最強大的一個控制邏輯就是 for,它即可以用來循環讀取數據,又可以當作 while 來 控制邏輯,還能迭代操作。它的語法如下:
for expression1; expression2; expression3 { ? ? //... }
expression1
、expression2
和 expression3
都是表達式,其中 expression1 和 expression3 是 變量聲明或者函數調用返回值之類的,expression2 是用來條件判斷,expression1在循環開始之前調用,expression3 在每輪循環結束之時調用。
一個例子比上面講那么多更有用,那么我們看看下面的例子吧:
package main import "fmt" func main(){ ? ? sum := 0; ? ? for index:=0; index < 10 ; index++ { ? ? sum += index } ? ? fmt.Println("sum is equal to ", sum) } // 輸出:sum is equal to 45
有些時候需要進行多個賦值操作,由于 Go 里面沒有,操作,那么可以使用平行賦值 i, j = i+1, j-1。有些時候如果我們忽略 expression1
和expression3
,
如下:
sum := 1 for ; sum < 1000; { ? ? sum += sum }
其中;也可以省略,那么就變成如下的代碼了,是不是似曾相識?
對,這就是 while
的功能。
sum := 1 for sum < 1000 { ? ? sum += sum }
在循環里面有兩個關鍵操作 break 和 continue ,break操作是跳出當前循環,continue是跳過本次循環。當嵌套過深的時候,break 可以配合標簽使用,即跳轉至標簽所指定的位置,
詳細參考如下例子:
for index := 10; index > 0; index-- { if index == 5{ ? ? break // 或者 continue } ? ? fmt.Println(index) } // break 打印出來 10、9、8、7、6 // continue 打印出來 10、9、8、7、6、4、3、2、1
break
和 continue
還可以跟著標號,用來跳到多重循環中的外層循環,for 配合 range 可以用于讀取 slice 和 map 的數據:
for k,v:=range map { ? ? fmt.Println("map's key:",k) ? ? fmt.Println("map's val:",v) }
由于 Go 支持“多值返回”, 而對于“聲明而未被調用”的變量, 編譯器會報錯, 在這種情況下,可以使用_來丟棄不需要的返回值 例如:
for _, v := range map{ ? ? fmt.Println("map's val:", v) }
5、switch
有些時候你需要寫很多的 if-else 來實現一些邏輯處理,這個時候代碼看上去就很丑很冗長,而且也不易于以后的維護,這個時候 switch 就能很好的解決這個問題。
它的語法如下:
switch sExpr { ? ? case expr1: ? ? ? ? some instructions ? ? case expr2: ? ? ? ? some other instructions ? ? case expr3: ? ? ? ? some other instructions ? ? default: ? ? ? ? other code }
sExpr 和expr1、expr2、expr3 的類型必須一致。Go 的 switch 非常靈活,表達式不必是常量或整數執行的過程從上至下,直到找到匹配項;而如果 switch 沒有表達式,它會匹配true。
i := 10 switch i { case 1: ? ? fmt.Println("i is equal to 1") case 2, 3, 4: ? ? fmt.Println("i is equal to 2, 3 or 4") case 10: ? ? fmt.Println("i is equal to 10") default: ? ? fmt.Println("All I know is that i is an integer") }
在上面代碼中,我們把很多值聚合在了一個 case 里面,同時,Go 里面 switch默認相當于每 個case 最后帶有break,匹配成功后不會自動向下執行其他 case,而是跳出整個 switch,但是可以使用 fallthrough
強制執行后面的 case 代碼。
integer := 6 switch integer { case 4: ? ? fmt.Println("The integer was <= 4") case 5: ? ? fmt.Println("The integer was <= 5") case 6: ? ? fmt.Println("The integer was <= 6") case 7: ? ? fmt.Println("The integer was <= 7") case 8: ? ? fmt.Println("The integer was <= 8") default: ? ? fmt.Println("default case") }
上面的程序將輸出:
The integer was <= 6 The integer was <= 7 The integer was <= 8 default case
原文鏈接:https://blog.csdn.net/weixin_46931877/article/details/122425819
相關推薦
- 2022-10-17 詳解Go語言中單鏈表的使用_Golang
- 2022-11-26 使用HttpClient增刪改查ASP.NET?Web?API服務_實用技巧
- 2023-11-20 數據處理matlibplot繪圖顏色對照表
- 2022-11-27 C語言中花式退出程序的方式總結_C 語言
- 2022-12-29 Kotlin數據存儲方式全面總結講解_Android
- 2022-12-13 深入了解Rust的生命周期_Rust語言
- 2023-11-15 【深度學習】YOLOv5斷點訓練——中斷后繼續訓練
- 2022-05-15 jQuery中的常用事件介紹_jquery
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支