網站首頁 編程語言 正文
分支結構
分支結構是結構化程序設計中的基礎。針對分支結構,Go 提供了兩種語句形式,一種是 if
,另一種是 switch
。
if
if
語句是 Go 中最常用、最簡單的分支控制結構,它分為單分支、雙分支以及多分支三種用法。if
語句會根據布爾變量或布爾表達式,在兩個或多個分支中選擇一個執行。以下為 if
語句的形式:
if bool_condition { // 新分支 } // 原分支
如果布爾變量或布爾表達式為 true
,則進入新分支執行,否則會繼續按照原分支的代碼去執行。
單分支 if
單分支的用法,如果布爾表達式成立,則執行新分支的代碼,然后繼續執行原分支的代碼,否則執行原分支的代碼,下面是代碼示例:
import "fmt" func main() { num := 3 if num > 2 { fmt.Println("num 大于 2") } fmt.Println("原分支代碼") }
打印結果
num 大于 2
原分支代碼
因為 num > 2
因此,程序運行之后,會執行新分支的打印語句以及原分支的打印語句。除了單個布爾表達式以外,還可以加入 &&
或 ||
條件運算符進行條件的組合,例如:
import "fmt" func main() { num := 3 if num > 2 && num < 10 { fmt.Println("num 大于 2 并且 num 小于 10") } fmt.Println("原分支代碼") }
雙分支 if-else
雙分支結構,if
配合 else
關鍵字實現。如果表達式為 true
,執行 分支1
,否則執行 分支2
,然后繼續執行 原分支
。下面是代碼示例:
import "fmt" func main() { age := 18 if age == 18 { fmt.Println("您已滿18歲") } else { fmt.Println("您未滿18歲") } fmt.Println("原分支代碼") }
執行結果:
您已滿18歲
原分支代碼
age
的值為 18
,因此會執行第一個分支的里打印語句,然后繼續執行原分支的打印語句。
多分支 if - else if - else
多分支需要在 if
和 else
的形式上,加上 else if
進行實現。如果 if
后面的布爾表達式不成立,則會判斷 else if
后面的布爾表達式,然后進行分支的選擇,下面是代碼示例:
import "fmt" func main() { name := "小明" if name == "小紅" { fmt.Println("您好,小紅!") } else if name == "小明" { fmt.Println("您好,小明!") } else { fmt.Println("您好,陌生人!") } fmt.Println("原分支代碼") }
執行結果:
您好,小明!
原分支代碼
程序根據布爾表達式條件的值,選擇了第二個分支去執行代碼。
在 if 語句中聲明變量
在 if
語句中,布爾表達式之前聲明變量是 Go
語言的慣用法,這種使用方式可以提高代碼的可讀性。由于是在 if
語句中聲明的變量,因此變量的作用域也只在 if 語句中,外部無法訪問這些變量。下面是示例:
import "fmt" func main() { mp := map[string]string{"name": "cmy"} if name, ok := mp["name"]; ok { fmt.Printf("存在 key → name:%s\n", name) } else { fmt.Println("key 不存在") } fmt.Println("原分支代碼") }
在 if
語句中定義 name,ok
變量,使用 ok
判斷 key
是否存在,如果存在則執行分支里的代碼。
switch
基本用法:
switch T { case value1: // 分支 1 case value2, value3, ...: // 分支 2 ... default: // 默認分支 }
T
可以是常量、變量和布爾表達式等,case
關鍵字后面的 value
類型,必須與 T
的類型是一致的,且 value
是唯一的。Go
會根據 T
的值與各個 case
后面的 value
進行匹配,匹配成功則執行對應 case
分支,case
后面可以有多個 value
。default 為默認分支,可有可無,如果前面的 case
都沒匹配上,則會執行 default
分支。
示例
import "fmt" func main() { name := "小明" if name == "小紅" { fmt.Println("您好,小紅!") } else if name == "小明" { fmt.Println("您好,小明!") } else { fmt.Println("您好,陌生人!") } fmt.Println("原分支代碼") }
上面的代碼,可以使用 switch
分支改造:
import "fmt" func main() { name := "小明" switch name { case "小明": fmt.Println("您好,小明!") case "小紅": fmt.Println("您好,小紅!") default: fmt.Println("您好,陌生人!") } fmt.Println("原分支代碼") }
執行結果:
您好,小明!
原分支代碼
name
等于 小明
,與第一個 case
分支匹配成功,執行這個分支的代碼,然后繼續執行原分支的代碼。
switch 分支當 if 分支使用
當 switch
分支后面不帶常量、變量或布爾表達式等時,其效果與 if
分支類似。
import "fmt" func main() { switch { case 1+1 != 2: fmt.Println("1 + 1 不等于 2") case 1+1 == 2: fmt.Println("1 + 1 等于 2") default: fmt.Println("0") } fmt.Println("原分支代碼") }
當 switch
后面什么都沒有時,程序會根據 case
后面布爾表達式的值進行分支的選擇。
在 switch 語句中聲明變量
和 if
一樣,我們也可以在 switch
語句中聲明變量,變量的作用域也只在 swtich
語句中,外部無法訪問這些變量。
import "fmt" func main() { mp := map[string]string{"name": "cmy"} switch name := mp["name"]; name { case "cmy": fmt.Println("cmy") case "kk": fmt.Println("kk") default: fmt.Println("unknown") } fmt.Println("原分支代碼") }
fallthrough
Go
語言中,不同于其他語言,switch
塊內,每個 case
無需聲明 break
來終止。如果我們想執行多個 case
分支,可以使用 fallthrough
關鍵字來實現。
import "fmt" func main() { mp := map[string]string{"name": "cmy"} switch name := mp["name"]; name { case "cmy": fmt.Println("cmy") fallthrough case "kk": fmt.Println("kk") default: fmt.Println("unknown") } fmt.Println("原分支代碼") }
執行結果:
cmy
kk
原分支代碼
在第一個 case
分支后面使用了 fallthrough
,不論下一個 case
是否與 cmy
匹配,都會執行這個分支的代碼。
小結
本文對兩種分支結構(if
、switch
)進行了介紹,也舉例說明了一些特殊的用法。如果代碼存在著復雜的 if
多分支結構,不妨用 swtich
進行改造,也許代碼的可讀性會更高。
原文鏈接:https://juejin.cn/post/7170354551483007006
相關推薦
- 2022-12-26 C++內存分區模型超詳細講解_C 語言
- 2023-06-04 Pandas中MultiIndex選擇并提取任何行和列_python
- 2022-09-15 C語言編寫實現學生管理系統_C 語言
- 2022-08-29 .NET?Core項目使用swagger開發組件_實用技巧
- 2022-05-06 python從數據庫中取出文件保存到excel,csv表格中的辦法:
- 2022-09-20 Android實現簡單實用的垂直進度條_Android
- 2023-02-05 Python實現前向和反向自動微分的示例代碼_python
- 2022-11-28 golang進程內存控制避免docker內oom_Golang
- 最近更新
-
- 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同步修改后的遠程分支