【Go語言】Go語言中的流程控制

Go語言中的流程控制

流程控制主要用于設定計算執行的順序,簡歷程序的邏輯結果,Go語言的流程控制語句與其他語言類似,支持如下幾種流程控制語句:

  • 條件語句:用于條件判斷,對應的關鍵字有if、else和else if;

  • 分支語句:用于分支選擇,對應的關鍵字有switch、case和select(用于通道);

  • 循環語句:用于循環迭代,對應的關鍵字有for和range;

  • 跳轉語句:用于代碼跳轉,對應的關鍵字有goto。

1 條件語句

條件語句的示例模板:

// if
if condition { // do something 
}
// if...else...
if condition { // do something 
} else {// do something 
}
// if...else if...else...
if condition1 { // do something 
} else if condition2 {// do something else 
} else {// catch-all or default 
}

注意以下幾點:

  • 條件語句不需要使用括號 () 將條件包含起來;

  • 無論語句體內有幾條語句,花括號 {} 都是必須存在的;

  • 左花括號 { 必須與 if 或者 else 處于同一行;

  • 在 if 之后,條件語句之前,可以添加變量初始化語句,使用 ; 間隔,例如: if score := 100;score > 90 {

以下是一個簡單的條件語句代碼示例:

score := 100
if score > 85 {fmt.Println("優秀")
} else if score > 70 {fmt.Println("良好")
} else if score >= 60 {fmt.Println("及格")
} else {fmt.Println("不及格")
}

2 分支語句

分支語句會根據傳入條件的不同,選擇不同的分支代碼執行。

分支語句的示例模板:

switch var1 {case val1:... case val2:... case val3,val4:...case val5:...fallthrough // 添加該語句default:...
}

注意以下幾點:

  • 和條件語句一樣,左花括號 { 必須與 switch 處于一行;

  • 單個 case 中,可以出現多個結果選項(通過逗號分隔);

  • Go語言中的分支語句不需要break來明確退出一個case;

  • 只有在case中明確添加 fallthrough 關鍵字,才會繼續執行緊跟著的下一個case語句;

  • 可以不設定 switch 之后條件表達式,這種情況下,整個 switch 結構與多個if...else...的邏輯作用等同。

一個簡單的分支語句示例:

score := 100
switch {
case score > 85:fmt.Println("優秀")
case score > 70 && score <= 85:fmt.Println("良好")
case score >= 60 && score <= 70:fmt.Println("及格")
default:fmt.Println("不及格")
}

Go語言中,可以通過逗號分隔不同的分支條件達到合并分支的目的,如 case 90,100,而不能像其他語言一樣,通過相鄰的case語句來進行分支的合并,這是因為Go語言不需要通過break退出某個分支,上一個case分支語句執行結束后,會自動進行退出,如果一定要執行后續的case語句,可以通過fallthrough語句來聲明。

month := 1
switch month {
case 3, 4, 5:fmt.Println("春季")
case 6, 7, 8:fmt.Println("夏季")
case 9, 10, 11:fmt.Println("秋季")
case 12:fmt.Println("冬季")fallthrough
case 1, 2:fmt.Println("冬季")
}

3 循環語句

Go語言中使用循環語句,需要注意以下幾點:

  • 和條件語句、分支語句一樣,左花括號 { 必須與for處于同一行;

  • 只支持for關鍵字循環語句,不支持while和do-while結構的循環語句;

  • 可以通過for-range結構對可迭代的集合進行遍歷;

  • 支持基于條件判斷進行循環迭代;

  • 允許在循環條件中定義和初始化變量,且支持多重賦值;

  • Go語言的for循環同樣支持continue和break來控制循環,但是它提供了一個更高級的break,可以選擇中斷哪一個循環。

3.1 for循環

Go語言的循環語句只支持 for 關鍵字,而不支持 while 和 do-while 結構,Go語言中,for循環的循環條件不包含括號,示例代碼如下:

sum := 0
for i :1; i <= 100; i++ {sum += i
}
fmt.Println(sum)

3.2 無限循環

Go語言僅支持for循環,針對無限循環的場景,可以通過不帶循環條件的for循環實現,代碼如下:

// 不指定循環語句,直接進行for循環,通過break退出循環語句
sum2 := 0
j := 0
for {j++if j > 100 {break}sum2 += j
}

3.3 多重循環

for 循環的條件表達式也支持多重賦值,可以實現數組/切片首尾元素的交換,代碼如下:

array := []int{1, 2, 3, 4, 5, 6}
for i, j := 0, len(array)-1; i < j; i, j = i+1, j-1 {array[i], array[j] = array[j], array[i]
}
fmt.Println(array)

3.4 for-range結構

Go語言中支持通過for-range結構對于可迭代的集合(數組、切片、字典)進行循環遍歷,使用方式如下:

array := []int{1, 2, 3, 4, 5, 6}
for k, v := range array {fmt.Println(k, v)
}

也可以只獲取鍵,或者只獲取值,代碼示例如下:

// 只獲取鍵
for k := range array {fmt.Printf("%d ", k)
}
// 只獲取值
for _, v := range array {fmt.Printf("%d ", v)
}

3.5 基于條件判斷循環

只有滿足指定的條件才會執行循環體中的代碼,代碼示例如下:

sum := 0
i := 0
for i < 100 {i++sum += i
}
fmt.Println(sum)

4 跳轉語句

4.1 break與continue語句

Go語言支持在循環語句中通過break語句跳出循環,通過continue語句進入下一個循環。

break語句代碼示例:

sum := 0
i := 0
for {i++if i > 100 {break}sum += i
}

continue語句代碼示例:

for i = 0; i < 5; i++ {if i%2 == 0 {continue}fmt.Printf("%d ", i)
}

4.2 標簽

Go語言中的break和continue支持與標簽結合跳轉到指定的標簽語句,標簽通過 標簽名 : 進行聲明:

break 標簽代碼示例:

arr := [][]int{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}
ITERATOR1:
for i := 0; i < 3; i++ {for j := 0; j < 3; j++ {num := arr[i][j]if j > 1 {break ITERATOR1}fmt.Println(num)}
}

如上所示,當j>1,此時循環執行到arr[0,2],直接跳到標簽ITERATOR1的位置,也即跳出了外層循環,同樣的語句換成continue再次執行:

arr := [][]int{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}
ITERATOR1:
for i := 0; i < 3; i++ {for j := 0; j < 3; j++ {num := arr[i][j]if j > 1 {continue ITERATOR1}fmt.Println(num)}
}

4.3 goto語句

goto語句并不建議使用,因為很容易造成代碼的邏輯混亂,導致難以發現的Bug,代碼示例如下:

arr := [][]int{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}
for i := 0; i < 3; i++ {for j := 0; j < 3; j++ {num := arr[i][j]if j > 1 {goto EXIT}fmt.Println(num)}
}
EXIT:
fmt.Println("EXIT.")

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/714637.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/714637.shtml
英文地址,請注明出處:http://en.pswp.cn/news/714637.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SQL 語句的執行順序

數據庫引擎在執行SQL語句并不是從SELECT開始執行&#xff0c;而是從FROM開始&#xff0c;執行順序如下(關鍵字前面的數字代表SQL執行的順序步驟)&#xff1a; ⑧SELECT ⑨DISTINCT ⑩①【Top Num】 【select list】 ①FROM {left_table_name} ③【join_type】 JOIN {righ…

vuecli配置sass

vuecli5如何配置sass sass有很多優勢&#xff0c;可以減少css重復&#xff0c;提高效率等&#xff0c;本人使用了 vuecli5 node -v 查看node版本根據版本安裝node-sass sass-loader 如我的版本“node-sass”: “^4.14.1”,“sass-loader”: “^7.1.0”,node -vv14.15.0&#…

使用 Docker 部署 Fiora 在線聊天室平臺

一、Fiora 介紹 Fiora 簡介 Fiora 是一款開源免費的在線聊天系統。 GitHub&#xff1a;https://github.com/yinxin630/fiora Fiora 功能 注冊賬號并登錄&#xff0c;可以長久保存你的數據加入現有群組或者創建自己的群組&#xff0c;來和大家交流和任意人私聊&#xff0c;并添…

MySQL 主從讀寫分離入門——基本原理以及ProxySQL的簡單使用

一、讀寫分離工作原理 讀寫分離的工作原理&#xff1a;在大型網站業務中&#xff0c;當單臺數據庫無法滿足并發需求時&#xff0c;通過主從同步方式同步數據。設置一臺主服務器負責增、刪、改&#xff0c;多臺從服務器負責查詢&#xff0c;從服務器從主服務器同步數據以保持一…

C語言數據結構——隊列

目錄 0.前言 1.隊列的基本概念 2.隊列的實現 2.1實現方式 2.2具體實現 3.隊列的應用場景 4.一道隊列的算法題&#xff08;LeetCode225. 用隊列實現棧&#xff09; 5.結語 &#xff08;圖像由AI生成&#xff09; 0.前言 在計算機科學領域&#xff0c;數據結構是組織和…

Linux篇: 進程控制

一、進程創建 1.1 fork函數初識 在Linux中&#xff0c;fork函數是非常重要的函數&#xff0c;它從已存在進程中創建一個新進程。新進程為子進程&#xff0c;而原進程為父進程。 返回值&#xff1a; 在子進程中返回0&#xff0c;父進程中返回子進程的PID&#xff0c;子進程創…

OSI七層模型/TCP四層模型

協議&#xff1a; 協議是雙方共同指定的一組規則&#xff0c;在網絡通信中表示通信雙方傳遞數據和解釋數據的一組規則。 從A上傳文件到服務器B,需要在A和B之間制定一個雙方都認可的規則&#xff0c;這個規則就叫文件傳輸協議&#xff0c;該協議是ftp協議的一個初級版本&#…

LeetCode 刷題 [C++] 第226題.翻轉二叉樹

題目描述 給你一棵二叉樹的根節點 root &#xff0c;翻轉這棵二叉樹&#xff0c;并返回其根節點。 題目分析 深度優先搜索&#xff08;DFS&#xff09;- 遞歸方式 對于二叉樹的鏡像問題&#xff0c;很容易想到的就是使用遞歸來解決&#xff0c;自底向上依次翻轉每一個節點…

2024年騰訊云優惠券領取頁面_代金券使用方法_新老用戶均可

騰訊云代金券領取渠道有哪些&#xff1f;騰訊云官網可以領取、官方媒體賬號可以領取代金券、完成任務可以領取代金券&#xff0c;大家也可以在騰訊云百科蹲守代金券&#xff0c;因為騰訊云代金券領取渠道比較分散&#xff0c;騰訊云百科txybk.com專注匯總優惠代金券領取頁面&am…

『大模型筆記』Sora:探索大型視覺模型的前世今生、技術內核及未來趨勢

Sora:探索大型視覺模型的前世今生、技術內核及未來趨勢 文章目錄 一. 摘要二. 引言楊立昆推薦的關于世界模型的真正含義(或應該是什么)的好文章。原文:Sora: A Review on Background, Technology, Limitations, and Opportunities of Large Vision Models譯文:Sora探索大型…

百度SEO快排原理是什么?如何快速排名方法?

前言&#xff1a;我之前說過我不打算寫這個快速排序。 首先&#xff0c;我從來沒有在自己的網站上操作過所謂的快速排序。 其次&#xff0c;我不能像網上很多人寫的那樣透露百度快速排序的秘密&#xff08;說實話&#xff0c;你可以透露秘密&#xff09;。 方法是有了&#xff…

Linux系統運維腳本:編寫bash腳本程序監控服務器的磁盤空間,在磁盤使用率超過閾值時發送警告郵件

目 錄 一、要求 二、解決方案 &#xff08;一&#xff09;解決思路 &#xff08;二&#xff09;方案 三、腳本程序實現 &#xff08;一&#xff09;腳本代碼和解釋 1、腳本代碼 2、代碼解釋 &#xff08;二&#xff09;腳本驗證 1、腳本編輯 2、給予執…

使用遞歸求解數組最大值(c++題解)

題目描述 輸入一個整數n&#xff08;n不大于1000&#xff09;&#xff0c;接下來分別為n個整數&#xff0c;請使用遞歸求取最大值。 輸入格式 第一行&#xff1a;正整數n。 第二行&#xff1a;n個整數。 輸出格式 輸出最大值 樣例 樣例輸入 復制2 1 2樣例輸出 復制2 …

Postman: 前端必備工具還是后端獨享利器

Postman 的使用場景&#xff1a;適用于前端和后端 Postman 是一個流行的 API 測試與開發工具。它被廣泛地應用在前后端開發的過程中&#xff0c;但是很多人對于它的使用場景存在疑惑。那么&#xff0c;到底是前端用還是后端用呢&#xff1f;本文將從多個角度詳細解答這個問題。…

Node.js_基礎知識(CommonJS模塊化)

CommonJS模塊化規范 加載時機&#xff1a; 服務器端: 模塊的加載是運行時同步加載的&#xff0c;node.js實現了模塊化規范瀏覽器端: 模塊需要提前編譯打包處理&#xff0c;需使用Browserify編譯打包&#xff0c;推薦使用ESM 暴露模塊&#xff1a;module.exports、exports導入模…

“а”搭配使用更地道,柯橋外貿俄語培訓

1、а именно 就是說&#xff0c;就是&#xff0c;正是 例&#xff1a; в то время, а именно год назад. 那時, 也就是一年前。 не кто иной, а именно г-н Ван. 不是別人&#xff0c;就是王先生 2、а наоборот …

【嵌入式——QT】QListWidget

QListWidget類提供了一個基于項的列表小部件&#xff0c;QListWidgetItem是列表中的項&#xff0c;該篇文章中涉及到的功能有添加列表項&#xff0c;插入列表項&#xff0c;刪除列表項&#xff0c;清空列表&#xff0c;向上移動列表項&#xff0c;向下移動列表項。 常用API a…

C語言數據結構基礎——雙鏈表專題

前言 書接上回&#xff0c;雙鏈表便是集齊帶頭、雙向、循環等幾乎所有元素的單鏈表PLUS. 1.初始化、創建雙鏈表 typedef int LTDataType; typedef struct LTNode {LTDataType data;struct LTNode* next;struct LTNode* prev; }LTNode; 不同于單鏈表&#xff0c;此時每個節點應…

selenium初始學習--打開新標簽操作

selenium 打開新標簽操作 簡單說一下使用 環境 &#xff1a;python 3.9 selenium 4,18 初始化操作 目的 打開bilibilie網站并搜索視頻&#xff08;電影&#xff09; 并點擊觀看 操作 打開應用并搜索網址 from selenium import webdriver import timefrom selenium.webdr…

PySide6+VSCode Python可視化環境搭建

#記住在cmd中運行&#xff0c;不要在vscode里運行&#xff0c;否則env會裝到工程目錄下 python -m venv env #env\Scripts\activate.bat pip install pyside6 下載本期源碼 vscode裝一個PYQT Integration插件&#xff0c;設置好兩個路徑&#xff08;下面有個腳本用于獲取路徑&…