一文搞懂Go語(yǔ)言中條件語(yǔ)句的使用
條件語(yǔ)句需要開發(fā)者通過指定一個(gè)或多個(gè)條件,并通過測(cè)試條件是否為 true 來決定是否執(zhí)行指定語(yǔ)句,并在條件為 false 的情況在執(zhí)行另外的語(yǔ)句。
Go 語(yǔ)言提供了以下幾種條件判斷語(yǔ)句:
| 語(yǔ)句 | 描述 |
|---|---|
| if 語(yǔ)句 | if 語(yǔ)句 由一個(gè)布爾表達(dá)式后緊跟一個(gè)或多個(gè)語(yǔ)句組成。 |
| if...else 語(yǔ)句 | if 語(yǔ)句 后可以使用可選的 else 語(yǔ)句, else 語(yǔ)句中的表達(dá)式在布爾表達(dá)式為 false 時(shí)執(zhí)行 |
| if 嵌套語(yǔ)句 | 你可以在 if 或 else if 語(yǔ)句中嵌入一個(gè)或多個(gè) if 或 else if 語(yǔ)句。 |
| switch 語(yǔ)句 | switch 語(yǔ)句用于基于不同條件執(zhí)行不同動(dòng)作。 |
| select 語(yǔ)句 | select 語(yǔ)句類似于 switch 語(yǔ)句,但是select會(huì)隨機(jī)執(zhí)行一個(gè)可運(yùn)行的case。如果沒有case可運(yùn)行,它將阻塞,直到有case可運(yùn)行。 |
if語(yǔ)句
if 語(yǔ)句由布爾表達(dá)式后緊跟一個(gè)或多個(gè)語(yǔ)句組成。
語(yǔ)法
Go 編程語(yǔ)言中 if 語(yǔ)句的語(yǔ)法如下:
if 布爾表達(dá)式 { /* 在布爾表達(dá)式為 true 時(shí)執(zhí)行 */ }
If 在布爾表達(dá)式為 true 時(shí),其后緊跟的語(yǔ)句塊執(zhí)行,如果為 false 則不執(zhí)行。
實(shí)例
使用 if 判斷一個(gè)數(shù)變量的大小:
package main
import "fmt"
func main() {
/* 定義局部變量 */
var a int = 10
/* 使用 if 語(yǔ)句判斷布爾表達(dá)式 */
if a < 20 {
/* 如果條件為 true 則執(zhí)行以下語(yǔ)句 */
fmt.Printf("a 小于 20\n" )
}
fmt.Printf("a 的值為 : %d\n", a)
}以上代碼執(zhí)行結(jié)果為:
a 小于 20 a 的值為 : 10
if...else 語(yǔ)句
if 語(yǔ)句 后可以使用可選的 else 語(yǔ)句, else 語(yǔ)句中的表達(dá)式在布爾表達(dá)式為 false 時(shí)執(zhí)行。
語(yǔ)法
Go 編程語(yǔ)言中 if...else 語(yǔ)句的語(yǔ)法如下:
if 布爾表達(dá)式 { /* 在布爾表達(dá)式為 true 時(shí)執(zhí)行 */ } else { /* 在布爾表達(dá)式為 false 時(shí)執(zhí)行 */ }
If 在布爾表達(dá)式為 true 時(shí),其后緊跟的語(yǔ)句塊執(zhí)行,如果為 false 則執(zhí)行 else 語(yǔ)句塊。
實(shí)例
使用 if else 判斷一個(gè)數(shù)的大?。?/p>
package main
import "fmt"
func main() {
/* 局部變量定義 */
var a int = 100;
/* 判斷布爾表達(dá)式 */
if a < 20 {
/* 如果條件為 true 則執(zhí)行以下語(yǔ)句 */
fmt.Printf("a 小于 20\n" );
} else {
/* 如果條件為 false 則執(zhí)行以下語(yǔ)句 */
fmt.Printf("a 不小于 20\n" );
}
fmt.Printf("a 的值為 : %d\n", a);
}以上代碼執(zhí)行結(jié)果為:
a 不小于 20 a 的值為 : 100
if 語(yǔ)句嵌套
你可以在 if 或 else if 語(yǔ)句中嵌入一個(gè)或多個(gè) if 或 else if 語(yǔ)句。
語(yǔ)法
Go 編程語(yǔ)言中 if...else 語(yǔ)句的語(yǔ)法如下:
if 布爾表達(dá)式 1 { /* 在布爾表達(dá)式 1 為 true 時(shí)執(zhí)行 */ if 布爾表達(dá)式 2 { /* 在布爾表達(dá)式 2 為 true 時(shí)執(zhí)行 */ } }
你可以以同樣的方式在 if 語(yǔ)句中嵌套 else if...else 語(yǔ)句
實(shí)例
嵌套使用 if 語(yǔ)句:
package main
import "fmt"
func main() {
/* 定義局部變量 */
var a int = 100
var b int = 200
/* 判斷條件 */
if a == 100 {
/* if 條件語(yǔ)句為 true 執(zhí)行 */
if b == 200 {
/* if 條件語(yǔ)句為 true 執(zhí)行 */
fmt.Printf("a 的值為 100 , b 的值為 200\n" );
}
}
fmt.Printf("a 值為 : %d\n", a );
fmt.Printf("b 值為 : %d\n", b );
}以上代碼執(zhí)行結(jié)果為:
a 的值為 100 , b 的值為 200 a 值為 : 100 b 值為 : 200
switch 語(yǔ)句
switch 語(yǔ)句用于基于不同條件執(zhí)行不同動(dòng)作,每一個(gè) case 分支都是唯一的,從上至下逐一測(cè)試,直到匹配為止。
switch 語(yǔ)句執(zhí)行的過程從上至下,直到找到匹配項(xiàng),匹配項(xiàng)后面也不需要再加 break。
switch 默認(rèn)情況下 case 最后自帶 break 語(yǔ)句,匹配成功后就不會(huì)執(zhí)行其他 case,如果我們需要執(zhí)行后面的 case,可以使用 fallthrough 。
語(yǔ)法
Go 編程語(yǔ)言中 switch 語(yǔ)句的語(yǔ)法如下:
switch var1 { case val1: ... case val2: ... default: ... }
變量 var1 可以是任何類型,而 val1 和 val2 則可以是同類型的任意值。類型不被局限于常量或整數(shù),但必須是相同的類型;或者最終結(jié)果為相同類型的表達(dá)式。
您可以同時(shí)測(cè)試多個(gè)可能符合條件的值,使用逗號(hào)分割它們,例如:case val1, val2, val3。
流程圖:

實(shí)例
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("優(yōu)秀!\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("你的等級(jí)是 %s\n", grade );
}以上代碼執(zhí)行結(jié)果為:
優(yōu)秀! 你的等級(jí)是 A
Type Switch
switch 語(yǔ)句還可以被用于 type-switch 來判斷某個(gè) interface 變量中實(shí)際存儲(chǔ)的變量類型。
Type Switch 語(yǔ)法格式如下:
switch x.(type){ case type: statement(s); case type: statement(s); /* 你可以定義任意個(gè)數(shù)的case */ default: /* 可選 */ statement(s); }
實(shí)例
package main
import "fmt"
func main() {
var x interface{}
switch i := x.(type) {
case nil:
fmt.Printf(" x 的類型 :%T",i)
case int:
fmt.Printf("x 是 int 型")
case float64:
fmt.Printf("x 是 float64 型")
case func(int) float64:
fmt.Printf("x 是 func(int) 型")
case bool, string:
fmt.Printf("x 是 bool 或 string 型" )
default:
fmt.Printf("未知型")
}
}以上代碼執(zhí)行結(jié)果為:
x 的類型 :<nil>
fallthrough
使用 fallthrough 會(huì)強(qiáng)制執(zhí)行后面的 case 語(yǔ)句,fallthrough 不會(huì)判斷下一條 case 的表達(dá)式結(jié)果是否為 true。
實(shí)例
package main
import "fmt"
func main() {
switch {
case false:
fmt.Println("1、case 條件語(yǔ)句為 false")
fallthrough
case true:
fmt.Println("2、case 條件語(yǔ)句為 true")
fallthrough
case false:
fmt.Println("3、case 條件語(yǔ)句為 false")
fallthrough
case true:
fmt.Println("4、case 條件語(yǔ)句為 true")
case false:
fmt.Println("5、case 條件語(yǔ)句為 false")
fallthrough
default:
fmt.Println("6、默認(rèn) case")
}
}以上代碼執(zhí)行結(jié)果為:
2、case 條件語(yǔ)句為 true 3、case 條件語(yǔ)句為 false 4、case 條件語(yǔ)句為 true
從以上代碼輸出的結(jié)果可以看出:switch 從第一個(gè)判斷表達(dá)式為 true 的 case 開始執(zhí)行,如果 case 帶有 fallthrough,程序會(huì)繼續(xù)執(zhí)行下一條 case,且它不會(huì)去判斷下一個(gè) case 的表達(dá)式是否為 true。
select 語(yǔ)句
select 是 Go 中的一個(gè)控制結(jié)構(gòu),類似于用于通信的 switch 語(yǔ)句。每個(gè) case 必須是一個(gè)通信操作,要么是發(fā)送要么是接收。
select 隨機(jī)執(zhí)行一個(gè)可運(yùn)行的 case。如果沒有 case 可運(yùn)行,它將阻塞,直到有 case 可運(yùn)行。一個(gè)默認(rèn)的子句應(yīng)該總是可運(yùn)行的。
語(yǔ)法
Go 編程語(yǔ)言中 select 語(yǔ)句的語(yǔ)法如下:
select {
case communication clause :
statement(s);
case communication clause :
statement(s);
/* 你可以定義任意數(shù)量的 case */
default : /* 可選 */
statement(s);
}以下描述了 select 語(yǔ)句的語(yǔ)法:
- 每個(gè) case 都必須是一個(gè)通信
- 所有 channel 表達(dá)式都會(huì)被求值
- 所有被發(fā)送的表達(dá)式都會(huì)被求值
- 如果任意某個(gè)通信可以進(jìn)行,它就執(zhí)行,其他被忽略。
- 如果有多個(gè) case 都可以運(yùn)行,Select 會(huì)隨機(jī)公平地選出一個(gè)執(zhí)行。其他不會(huì)執(zhí)行。
否則:
如果有 default 子句,則執(zhí)行該語(yǔ)句。
如果沒有 default 子句,select 將阻塞,直到某個(gè)通信可以運(yùn)行;Go 不會(huì)重新對(duì) channel 或值進(jìn)行求值。
實(shí)例
select 語(yǔ)句應(yīng)用演示:
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")
}
}以上代碼執(zhí)行結(jié)果為:
no communication
校內(nèi)舉辦跑步比賽,10s內(nèi)進(jìn)去比賽,分性別,進(jìn)入男子組,女子組
package main
import "fmt"
//if語(yǔ)句嵌套
//校內(nèi)舉辦跑步比賽,10s內(nèi)進(jìn)去比賽,分性別,進(jìn)入男子組,女子組
func main() {
var (
a = 9
b = "男"
)
if a < 10 && b == "男" {
fmt.Println("進(jìn)去決賽")
fmt.Println("進(jìn)入男子")
}
if a < 10 && b == "女" {
fmt.Println("進(jìn)去決賽")
fmt.Println("進(jìn)入女子組")
}
if a > 10 {
fmt.Println("滾")
}
/*
if a < 10 {
fmt.Println("進(jìn)去決賽")
if b == "男" {
fmt.Println("進(jìn)入男子")
} else {
fmt.Println("進(jìn)入女子")
}
} else {
fmt.Println("滾")
}*/
}
//switch語(yǔ)句,對(duì)學(xué)生成績(jī)進(jìn)行考評(píng),90-100:優(yōu)秀,80-89:良好,60-79及格,60以下,不及格
package main
import "fmt"
func main() {
var vaule = 1
switch vaule {
case 1:
fmt.Println("1")
case 2:
fmt.Println("2")
case 3:
fmt.Println("3")
default:
fmt.Println("滾犢子")
}
/*
var a = 77
//等效于if else 語(yǔ)句
switch {
case a >= 90 && a <= 100:
fmt.Println("好")
case a >= 80 && a <= 89:
fmt.Println("還行")
case a >= 60 && a <= 79:
fmt.Println("合格")
default:
fmt.Println("不合格")
}*/
}以上就是一文搞懂Go語(yǔ)言中條件語(yǔ)句的使用的詳細(xì)內(nèi)容,更多關(guān)于Go語(yǔ)言條件語(yǔ)句的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
golang中為什么Response.Body需要被關(guān)閉詳解
這篇文章主要給大家介紹了關(guān)于golang中為什么Response.Body需要被關(guān)閉的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-08-08
Golang分布式應(yīng)用定時(shí)任務(wù)示例詳解
這篇文章主要為大家介紹了Golang分布式應(yīng)用定時(shí)任務(wù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
Go語(yǔ)言實(shí)現(xiàn)逐行讀取和寫入文件詳解
這篇文章主要介紹了如何使用go語(yǔ)言實(shí)現(xiàn)從輸入文件中讀取每行數(shù)據(jù),然后將每行字段組合成SQL插入腳本,然后逐行寫入另外一個(gè)空白文件中,有需要的可以參考下2024-01-01
使用Go Validator有效驗(yàn)證數(shù)據(jù)示例分析
作為一名開發(fā)者,確保Go應(yīng)用中處理的數(shù)據(jù)是有效和準(zhǔn)確的非常重要,Go Validator是一個(gè)開源的數(shù)據(jù)驗(yàn)證庫(kù),為Go結(jié)構(gòu)體提供強(qiáng)大且易于使用的數(shù)據(jù)驗(yàn)證功能,本篇文章將介紹Go Validator庫(kù)的主要特點(diǎn)以及如何在Go應(yīng)用中使用它來有效驗(yàn)證數(shù)據(jù)2023-12-12
golang?墻上時(shí)鐘與單調(diào)時(shí)鐘的實(shí)現(xiàn)
本文主要介紹了golang?墻上時(shí)鐘與單調(diào)時(shí)鐘的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
golang中實(shí)現(xiàn)graphql請(qǐng)求的方法
這篇文章主要介紹了如何在golang中實(shí)現(xiàn)graphql請(qǐng)求,在本文中,我們介紹了如何使用gqlgen來構(gòu)建GraphQL服務(wù),需要的朋友可以參考下2023-04-04
一文詳解Golang中net/http包的實(shí)現(xiàn)原理
這篇文章主要介紹了如何用?net/http?自己編寫實(shí)現(xiàn)一個(gè)?HTTP?Server?并探究其實(shí)現(xiàn)原理,具體講解Go語(yǔ)言是如何接收和處理請(qǐng)求的,希望能夠?qū)Υ蠹业膶W(xué)習(xí)或工作具有一定的幫助2022-08-08
四種Golang實(shí)現(xiàn)middleware框架的方式小結(jié)
middleware是一般框架里面常用的形式,比如web框架、rpc框架等,本文為大家詳細(xì)介紹了四種實(shí)現(xiàn)middleawre的方式,感興趣的可以了解一下2024-03-03

