網站首頁 編程語言 正文
Go語言基礎四
今天我們要來學習if語句,也就是大家口中的判斷語句,我們首先來看一下if語句的定義
if定義
條件語句需要開發者通過指定一個或多個條件,并通過測試條件是否為 true 來決定是否執行指定語句,并在條件為 false 的情況在執行另外的語句。相信讀者看到這兒,也是云里霧里的感覺,我們怎么來表示true和false呢?
單層if語法格式
- 可省略條件表達式括號。
- 持初始化語句,可定義代碼塊局部變量。?
- 代碼塊左 括號必須在條件表達式尾部。
? ? if 布爾表達式 {
? ? /* 在布爾表達式為 true 時執行 */
? ? } ?
這里要為讀者介紹的是,如果if后面的條件語句程序給出的數能夠滿足,則我們表示為true
;如果不能,則返回false
package main ? import "fmt" ? func main() { a := 3 if a > 2 { fmt.Println("true") } else { fmt.Println("false") } }
如代碼塊所示,這里我們定義了一個變量a的值為3,接下來是一個if判斷,如果該數值>2,則調用函數打印輸出true
;否則返回false
。換句話說,我們這里即是對a變量的一個判斷,至于調用函數打印輸出的內容,由讀者自行決定
語法警告
在Go語法中,不支持三元操作符(三目運算符) a > b ? a : b,如果讀者對三元運算符較感興趣,可以移步至java了解三元運算符(其本質上也是一種if判斷形式)
package main ? import "fmt" ? func main() { /* 定義局部變量 */ var a int = 10 /* 使用 if 語句判斷布爾表達式 */ if a < 20 { /* 如果條件為 true 則執行以下語句 */ fmt.Printf("a 小于 20\n" ) } fmt.Printf("a 的值為 : %d\n", a) }
上方是關于if判斷的一個小練習,讀者自行體會即可;if
在布爾表達式為 true
時,其后緊跟的語句塊執行,如果為 false
則執行 else
語句塊。
package main import "fmt" func main() { /* 局部變量定義 */ var a int = 100 /* 判斷布爾表達式 */ if a < 20 { /* 如果條件為 true 則執行以下語句 */ fmt.Printf("a 小于 20\n" ) } else { /* 如果條件為 false 則執行以下語句 */ fmt.Printf("a 不小于 20\n" ) } fmt.Printf("a 的值為 : %d\n", a) }
在Go語言
中,if語句也支持嵌套處理,即可以實現多重if判斷以達到程序想要的結果
多層if語法格式
if 布爾表達式 1 {
? ?/* 在布爾表達式 1 為 true 時執行 */
? ?if 布爾表達式 2 {
? ? ? /* 在布爾表達式 2 為 true 時執行 */
? ?}
}?
package main ? import "fmt" ? func main() { /* 定義局部變量 */ var a int = 100 var b int = 200 /* 判斷條件 */ if a == 100 { /* if 條件語句為 true 執行 */ if b == 200 { /* if 條件語句為 true 執行 */ fmt.Printf("a 的值為 100 , b 的值為 200\n" ) } } fmt.Printf("a 值為 : %d\n", a ) fmt.Printf("b 值為 : %d\n", b ) }
如上圖所示,我們在if
語句里面嵌套了另一個if語句,即是在默認a == 100的情況下寫出對變量b的值的判斷,最終調用函數打印輸出a和b的值
有時候我們多個變量匹配同一個值,就會用到Switch
語句
Switch定義
switch
語句用于基于不同條件執行不同動作,每一個 case
分支都是唯一的,從上直下逐一測試,直到匹配為止。Golang switch
分支表達式可以是任意類型,不限于常量??墒÷?break
,默認自動終止。
Switch語法格式
switch var1 { case val1: ... case val2: ... default: ... }
package main import "fmt" func main() { /* 定義局部變量 */ var grade string = "B" var marks int = 90 ? switch marks { case 90: grade = "A" case 80: grade = "B" case 50,60,70 : grade = "C" default: grade = "D" } ? switch { case grade == "A" : fmt.Printf("優秀!\n" ) case grade == "B", grade == "C" : fmt.Printf("良好\n" ) case grade == "D" : fmt.Printf("及格\n" ) case grade == "F": fmt.Printf("不及格\n" ) default: fmt.Printf("差\n" ) } fmt.Printf("你的等級是 %s\n", grade ) }
由上方代碼塊可知,我們定義了兩個局部變量grade和marks,對marks進行Switch
判斷操作,當case
滿足不同的值的時候,調用函數打印輸出的值也不一樣
Type Switch
switch
語句還可以被用于 type-switch
來判斷某個 interface 變量中實際存儲的變量類型
Type Switch語法格式
switch x.(type){ case type: statement(s) case type: statement(s) /* 你可以定義任意個數的case */ default: /* 可選 */ statement(s) }
由于Type Switch
用途不是特別的多,作者在這里不作詳細描述,讀者可以去官網自行查詢相關文檔進行學習
Select定義
-
select
語句類似于switch
語句,但是select
會隨機執行一個可運行的case
。如果沒有case
可運行,它將阻塞,直到有case
可運行。 -
select
是Go
中的一個控制結構,類似于用于通信的switch
語句。每個case
必須是一個通信操作,要么是發送要么是接收。 -
select
隨機執行一個可運行的case
。如果沒有case
可運行,它將阻塞,直到有case
可運行。一個默認的子句應該總是可運行的。
Select語法格式
select { case communication clause : statement(s); case communication clause : statement(s); /* 你可以定義任意數量的 case */ default : /* 可選 */ statement(s); }
Select語句注意事項
- 每個
case
都必須是一個通信 - 所有
channel
表達式都會被求值 - 所有被發送的表達式都會被求值
- 如果任意某個通信可以進行,它就執行;其他被忽略。
- 如果有多個
case
都可以運行,Select會隨機公平地選出一個執行。其他不會執行。 - 如果有
default
子句,則執行該語句。 - 如果沒有
default
字句,select
將阻塞,直到某個通信可以運行;Go
不會重新對channel
值重新進行求值。
package main ? import "fmt" ? func main() { var c1, c2, c3 chan int //通道機制 var i1, i2 int select { case i1 = <-c1: fmt.Printf("received ", i1, " from c1\n") case c2 <- i2: fmt.Printf("sent ", i2, " to c2\n") case i3, ok := (<-c3): // same as: i3, ok := <-c3 if ok { fmt.Printf("received ", i3, " from c3\n") } else { fmt.Printf("c3 is closed\n") } default: fmt.Printf("no communication\n") } }
根據上方代碼所示,定義了c1、c2、c3
三個變量,并且使用chan
通道。關于寫法的解釋:一個可以發送 int
類型數據的 channel
一般寫為 chan int
,根據上方的語法規則:如果有default
子句,則執行該語句,故上方代碼塊執行代碼為:no communication
Select用法補充
- 我們可以使用
select
來監聽channel
的數據流動 -
select
的用法與switch
語法非常類似,由select
開始的一個新的選擇塊,每個選擇條件由case
語句來描述 -
switch
語句可以選擇任何使用相等比較的條件相比,select
由比較多的限制,其中最大的一條限制就是每個case
語句里必須是一個IO操作
- 如果每個
case
都未讀取到,則Go語言
會自動讀取default
語句所描述的東西,在正常情況下,每個select
程序都會有一個輸出語句 - 如果既沒有
case
語句滿足,也不存在default
語句,則程序進入阻塞狀態,系統會發出警告,直至疏通
超時判斷
var resChan = make(chan int) // do request func test() { select { case data := <-resChan: doData(data) case <-time.After(time.Second * 3): fmt.Println("request time out") } } ? func doData(data int) { //... }
根據上方代碼塊可知,我們定義了一個select
語句,在第一條case
里面,我們將resChan
傳給data
,如果在傳輸的過程中時長超過3s,則會執行第二條case
語句
退出
var shouldQuit=make(chan struct{}) fun main(){ { //loop } //...out of the loop select { case <-c.shouldQuit: cleanUp() return default: } //... } ? //在另外一個協程中,如果運行遇到非法操作或不可處理的錯誤,就向shouldQuit發送數據通知程序停止運行 close(shouldQuit)
我們定義一個var類型的shouldQuit
變量用于結構體的通道,首先我們開啟一個select循環,在case
里面調用通道方法,并且返回所對應的值;如果不滿足,則返回default的值。同時我們在另外一個協程中,如果我們遇到了非法操作或不可處理的錯誤,就向shouldQuit
發送數據通知程序停止運行
判斷Channel狀態
ch := make (chan int, 5) //... data:=0 select { case ch <- data: default: }
有時候我們不喜歡緩存變慢,這樣不利于我們去釋放資源,因此我們可以用一個簡單的判斷方法去進行判斷:首先我們開啟一個int類型,長度為5的通道,在通道里面我們開啟一個select
循環,如果data通道的值能被ch所接收,則執行該條語句,否則我們可對default語句
進行拋棄data等處理操作
原文鏈接:https://juejin.cn/post/7169400353715290142
相關推薦
- 2022-03-31 SQL?Server的觸發器詳解_MsSql
- 2022-12-08 Apache?Cordova?Android原理應用實例詳解_Android
- 2022-03-24 Android使用Span打造豐富多彩的文本詳解_Android
- 2022-10-28 ReactDOM?隱藏特性詳解_React
- 2022-03-15 could not open extension control file “/usr/pgsql-
- 2022-09-15 C++中的幾個特殊符號說明_C 語言
- 2021-12-18 ECommerceCrawlers項目分析(十二)
- 2022-06-28 ASP.NET一次性對GridView批量更新多行數據_實用技巧
- 最近更新
-
- 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同步修改后的遠程分支