[GO語言基礎] 五.順序控制語句和條件控制語句(if、else、switch)(go語言入門)
這些年我學過各種編程語言,從最早的C語言到C++,再到C#、PHP、JAVA,再到IOS開發、Python,到最新的GO語言,學得是真的雜。有時候覺得編程語言恰恰是最簡單的,而通過一門編程語言能夠解決實際問題或深入底層才是其價值所在,并且當我們學好一門編程語言后,其他編程語言都非常類似,殊途同歸,學起來也很迅速。

源碼-:
https://github.com/eastmountyxz/Go-learning
前文參考:
[GO語言基礎] 一.為什么我要學習Golang以及GO語言入門普及
[GO語言基礎] 二.編譯運行、語法規范、注釋轉義及API標準庫知識普及
[GO語言基礎] 三.變量聲明、數據類型、標識符及編程練習12題
[GO語言基礎] 四.算術運算、邏輯運算、賦值運算、位運算及編程練習
[GO語言基礎] 五.順序控制語句和條件控制語句(if、else、switch)
文章目錄
一.順序控制語句
二.條件控制語句
1.單分支控制
2.雙分支控制
3.多分支控制
4.嵌套分支
三.switch分支控制
四.編程練習
1.題目
2.答案
五.總結
在程序中,程序運行的流程控制決定程序是如何執行的,也是大家必須要掌握的,主要有三大流程控制語句。這篇文章先介紹前兩個流程控制。
順序控制
分支控制
循環控制
一.順序控制語句
順序控制是指程序從上到下逐行地執行,中間沒有任何判斷和跳轉。其流程圖如下所示:
下面舉個簡單的案例說明。代碼中沒有判斷,程序按照默認的流程執行,即順序控制。
package main import "fmt" func main() { //假如還有97天放假 問多少個星期多少天 var num int = 97 var week int var day int week = num / 7 day = num % 7 fmt.Printf("%d個星期零%d天 \n", week, day) //定義一個變量保存華氏溫度 轉換成攝氏溫度 //攝氏溫度=5/9*(攝氏溫度-32) var huashi float32 = 134.2 var sheshi float32 sheshi = 5.0 / 9 * (huashi - 32) fmt.Printf("%v 對應的攝氏溫度=%v \n", huashi, sheshi) }
輸出結果如下圖所示:
注意,Golang中定義變量時采用合法的前向引用,比如正確形式:
func main() { var num1 int = 10 //聲明num1 var num2 int = num1 + 20 //使用num1 fmt.Println(num2) }
錯誤形式:
func main() { var num2 int = num1 + 20 //使用num1 var num1 int = 10 //聲明num1(x) fmt.Println(num2) }
二.條件控制語句
分支控制是讓程序有選擇執行,包括三種常見形式:
單分支
雙分支
多分支
1.單分支控制
基本語法如下:
if 條件表達式 { 執行代碼塊 }
說明:當條件表達式為True時,就會執行括號中的代碼塊。?注意{}是必須有的,即使只寫一行代碼。對應的流程圖如下所示:
案例分析:編寫代碼實現輸入人的年齡,如果年齡大于18歲,則輸出“你的年齡大于18歲”。
package main import "fmt" func main() { //輸入年齡 var age int fmt.Println("請輸入年齡:") fmt.Scanln(&age) //單分支判斷 if age > 18 { fmt.Println("你的年齡大于18歲") } }
輸出結果如下圖所示:
注意事項:
在golang中支持在if語句直接定義一個變量,如下所示:
if n := 20; n > 5 { fmt.Println("定義變量的值數字大于5") }
2.雙分支控制
基本語法如下:
if 條件表達式 { 執行代碼塊1 } else { 執行代碼塊2 }
說明:當條件表達式為True時,否則執行代碼塊2。注意{}是必須有的,即使只寫一行代碼。?對應的流程圖如下所示:
案例分析:編寫代碼實現輸入人的年齡,如果年齡大于18歲,則輸出“你的年齡大于18歲”;否則輸出“你的年齡小于等于18歲”。
package main import "fmt" func main() { //輸入年齡 var age int fmt.Println("請輸入年齡:") fmt.Scanln(&age) //單分支判斷 if age > 18 { fmt.Println("你的年齡大于18歲") } else { fmt.Println("你的年齡小于等于18歲") } }
輸出結果如下圖所示:
注意事項:
條件表達式是age > 18,執行代碼塊1和執行代碼塊2
雙分支只會執行其中一個分支
條件語句嵌套
案例:對下列代碼,若有輸出,指出輸出結果。
package main import "fmt" func main() { var x int = 4 var y int = 1 //雙分支嵌套判斷 if (x > 2) { if (y > 2) { fmt.Println(x + y) fmt.Println("執行語句:----a----") } fmt.Println("執行語句:----b----") } else { fmt.Println("x is", x, "y is", y) fmt.Println("執行語句:----c----") } }
輸出結果如下圖所示:
條件判斷
聲明兩個int32型變量并復制,判斷兩個數之和,如果大于等于50輸出
聲明兩個float64型變量,判斷第一個數大于10.0,并且第二個數小于20.0輸出兩數之和
聲明兩個int32型變量,判斷兩者之和是否能被3又能被5整除,輸出信息
package main import "fmt" func main() { //判斷兩個數之和大于等于50 var n1 int32 = 10 var n2 int32 = 50 if n1 + n2 >= 50 { fmt.Println("相加結果大于等于50") } //判斷第一個數大于10.0,并且第二個數小于20.0 var n3 float64 = 11.0 var n4 float64 = 17.0 if n3 > 10.0 && n4 < 20.0 { fmt.Println("輸出兩數之和 =", (n3+n4)) } //判斷兩者之和是否能被3又能被5整除 var n5 int32 = 10 var n6 int32 = 5 if (n5 + n6) % 3 == 0 && (n5 + n6) % 5 ==0 { fmt.Println("能被3和5整除") } }
輸出結果如下圖所示:
錯誤案例1:編譯錯誤,缺少括號{}
syntax error: unexpected newline, expecting { after if clause
錯誤案例2:編譯錯誤,else不能換行
syntax error: unexpected else, expecting }
3.多分支控制
基本語法如下:
if 條件表達式1 { 執行代碼塊1 } else if 條件表達式2 { 執行代碼塊2 } ... else { 執行代碼塊n }
說明:
先判斷條件表達式1是否成立,如果為True,就執行代碼塊1
如果條件表達式1位False,就去判斷條件表達式2是否成立,如果條件表達式2成立,就執行代碼塊2
依次類推,如果所有的條件表達式不成立,就執行else語句塊
else不是必須的
注意:多分支語句只能有一個執行入口
對應的流程圖如下所示:
案例分析:編寫代碼實現考試成績判斷,如果成績大于等于90則為A,如果成績[80,90)則為B,依次類推不及格為E。
package main import "fmt" func main() { //輸入變量 var score int fmt.Println("請輸入成績:") fmt.Scanln(&score) //多分支判斷 if score >= 90 { fmt.Println("該同學成績為A") } else if score >=80 && score < 90 { fmt.Println("該同學成績為B") } else if score >=70 && score < 80 { fmt.Println("該同學成績為C") } else if score >=60 && score < 70 { fmt.Println("該同學成績為D") } else { fmt.Println("該同學成績為E") } fmt.Printf("成績為:%d", score) }
輸出結果如下圖所示:
注意事項:
初學者需要注意多分支語句的條件判斷,經常會陷入判斷融合的情況,比如下圖只會輸出“ok1”。
案例1:融合bool類型多分支判斷
package main import "fmt" func main() { //多分支判斷 var b bool = true if b == false { fmt.Println("a") } else if b { fmt.Println("b") } else if !b { fmt.Println("c") } else { fmt.Println("d") } }
輸出結果為“b”,如果將第一個判斷修改成“b=false”是否能編譯通過呢?答案是否,它會提示編譯錯誤,因為if條件表達式不能是賦值語句。
案例2:輸入一個字符,判斷:
它是否為大寫字母,如果是轉換成小寫;
它是否為小寫字母,如果是轉換層大寫;
否則,輸出原字符
package main import "fmt" func main() { var ch byte var res byte fmt.Println("請輸入字母:") fmt.Scanf("%c", &ch) //大小寫轉換 if ch >= 'A' && ch <= 'Z' { res = ch + 32 } else if ch >= 'a' && ch <= 'z' { res = ch - 32 } else { res = ch } fmt.Printf("輸入字母:%c %v \n", ch, ch) fmt.Printf("輸出結果:%c %v \n", res, res) }
輸出結果如下圖所示,這道題目非常棒,希望大家熟練掌握。知識點包括:
ASCII碼大小寫轉換方法
多分支條件語句
char字符型變量輸入輸出
4.嵌套分支
在一個分支結果中又完整嵌套另一個完整的分支結構,里面的分支結構稱為內層分支,外面的分支結構稱為外層分支。基本語法如下:
if 條件表達式 { if 條件表達式 { 語句塊 } else { 語句塊 } .... }
注意事項:
嵌套分支不宜過多,建議控制在三層內
案例分析:
參加百米運動會,如果用時8秒以內進入決賽,否則提示淘汰;并且根據性別提示進入男子組或女子組,我們輸入成績和性別進行相關判斷。
package main import "fmt" func main() { var sex string var second float64 fmt.Println("請輸入秒數:") fmt.Scanln(&second) //嵌套分支 if second <=8 { fmt.Println("請輸入性別:") fmt.Scanln(&sex) if sex == "男" { fmt.Println("進入決賽的男子組") } else if sex == "女" { fmt.Println("進入決賽的女子組") } else { fmt.Println("性別輸入錯誤") } } else { fmt.Println("淘汰未進入決賽") } }
輸出結果如圖所示:
三.switch分支控制
switch語句用于基于不同條件執行不同動作,每個case分支都是唯一的,從上往下逐一測試,直到匹配為止。
注意,匹配項后面不需要再加break
。
基本語法如下:
switch 表達式 { case 表達式1, 表達式2, ...: 語句塊1 case 表達式3, 表達式4, ...: 語句塊2 .... default: 語句塊n }
對應的流程圖如下所示:
switch的執行流程是先執行表達式,得到值,然后和case的表達式進行比較,如果相等,就匹配到;接著執行對應case的語句塊,然后退出switch控制。
如果switch表達式的值沒有和任何case的表達式匹配成功,則執行default的語句塊,執行后退出switch的控制。
golang中的case后的表達式可以有多個,使用逗號間隔。
golang中的case語句塊不需要寫break,因為默認會有。即在默認情況下,當程序執行完case語句塊后,就直接退出該switch控制結構。
下面簡單實現一個switch語句案例。請編寫程序實現輸入某個字符,然后a表示周一,b表示周二,c表示周三,根據用戶的輸入依次顯示信息。
package main import "fmt" func main() { var key byte fmt.Println("請輸入a到g的一個字符") fmt.Scanf("%c", &key) //switch語句 switch key { case 'a': fmt.Println("今天星期一") case 'b': fmt.Println("今天星期二") case 'c': fmt.Println("今天星期三") case 'd': fmt.Println("今天星期四") case 'e': fmt.Println("今天星期五") case 'f': fmt.Println("今天星期六") case 'g': fmt.Println("今天星期天") default: fmt.Println("輸入有誤....") } }
輸出結果如下圖所示:
注意事項:
(1) case和switch后是一個表達式,即常量值、變量、一個有返回值的函數等
(2) case后的各個表達式值的數據類型,必須和switch的表達式數據類型一致
(3) case后面可以帶多個表達式,使用逗號間隔,如下圖所示:
(4) case后的表達式如果是常量值,則要求不能重復
(5) case后面不需要帶break,程序匹配到一個case后就會執行對應的代碼塊,然后退出switch,如果一個都匹配不到,則執行default
(6) default語句不是必須的
(7) switch后也可以不帶表達式,類似于if-else分支來使用;同時case中也可以對范圍進行判斷
package main import "fmt" func main() { //switch后不接表達式 類似于if-else分支來使用 var age int = 10 switch { case age == 10: fmt.Println("年齡為10") case age == 20: fmt.Println("年齡為20") default: fmt.Println("沒有匹配到") } //case中也可以對范圍進行判斷 var score int = 90 switch { case score > 90: fmt.Println("成績優秀...") case score >= 70 && score <= 90: fmt.Println("成績良好...") case score >=60 && score <70: fmt.Println("成績及格...") default: fmt.Println("不及格") } }
(8) switch后也可以直接聲明定義變量,分好結束,但不推薦使用。
(9) switch穿透fallthrough。如果在case語句塊后增加fallthrough,則會繼續執行下一個case,也叫switch穿透。
package main import "fmt" func main() { //switch穿透fallthrough var age int = 10 switch age { case 10: fmt.Println("年齡為10") fallthrough //默認只能穿透一層 case 20: fmt.Println("年齡為20") fallthrough case 30: fmt.Println("年齡為30") default: fmt.Println("沒有匹配到") } }
輸出結果如下圖所示:
(10) Type Switch。switch語句還可以被用于type-switch來判斷某個interface(接口)變量中實際指向的變量類型。后續文章會補充interface。
package main import "fmt" func main() { //type-switch var x interface{} //定義空接口 var y = 10.0 x = y 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.Println("未知類型") } }
最后簡單總結switch和if的區別:
如果判斷的具體數值不多,而且符合整數、浮點數、字符、字符串這幾種類型,建議使用switch語句,簡潔高效。
其他情況:對區間判斷和結果為bool類型的判斷使用if,并且if的使用范圍更廣。
四.編程練習
1.題目
(1) 判斷一個年份是否是閏年,閏年的條件是符合以下二者之一。
年份能被4整除,但不能被100整除
年份能被400整除
(2) 請分別使用if和switch語句實現成績判斷,輸出分數對應的等級。
[100, 90] => A
[80, 90) => B
[70, 80) => C
[60, 70) => D
[0, 60) => E
(3) 根據淡旺季的月份和年齡,實現一個票價系統。
旺季:4-10月
成人(18-60歲):60
兒童(<18):半價
老人(>60):1/3
淡季
成人:40
其他:20
(4) 使用switch語句實現:根據用戶輸入月份,輸出對應春夏秋冬季節。
(5) 求ax^2+bx+c=0方程的根。a、b、c分別為函數的參數,如果b^2-4ac>0,則有兩個解;如果b^2-4ac=0,則有一個解;否則無解。
提示:x1=(-b+sqrt(b^2-4ac))/2a
提示:x2=(-b-sqrt(b^2-4ac))/2a
2.答案
(1) 判斷一個年份是否是閏年,閏年的條件是符合以下二者之一。
年份能被4整除,但不能被100整除
年份能被400整除
代碼如下:
package main import "fmt" func main() { //判斷閏年 var year int fmt.Println("請輸入年份:") fmt.Scanln(&year) if (year % 4 == 0 && year % 100 !=0) || year % 400 == 0 { fmt.Println(year, "是閏年~") } else { fmt.Println(year, "不是閏年~") } }
輸出結果如下圖所示:
(2) 請分別使用if和switch語句實現成績判斷,輸出分數對應的等級。
[100, 90] => A
[80, 90) => B
[70, 80) => C
[60, 70) => D
[0, 60) => E
代碼如下:
package main import "fmt" func main() { var score int fmt.Println("請輸入分數:") fmt.Scanln(&score) //if判斷 if score >= 90 { fmt.Println("分數等級為A") } else if score >= 80 && score < 90 { fmt.Println("分數等級為B") } else if score >= 70 && score < 80 { fmt.Println("分數等級為C") } else if score >= 60 && score < 70 { fmt.Println("分數等級為D") } else { fmt.Println("不及格等級為E") } //switch判斷 switch { case score > 90: fmt.Println("分數等級為A") case score >= 80 && score < 90: fmt.Println("分數等級為B") case score >=70 && score < 80: fmt.Println("分數等級為C") case score >=60 && score < 70: fmt.Println("分數等級為D") default: fmt.Println("不及格等級為E") } }
輸出結果如下圖所示:
(3) 根據淡旺季的月份和年齡,實現一個票價系統。
旺季:4-10月
成人(18-60歲):60
兒童(<18):半價
老人(>60):1/3
淡季
成人:40
其他:20
代碼如下:
package main import "fmt" func main() { //出票系統 var month byte var age byte var price float64 = 60.0 fmt.Println("請輸入游玩月份:") fmt.Scanln(&month) fmt.Println("請輸入游客年齡:") fmt.Scanln(&age) if month >= 4 && month <= 10 { //旺季 if age > 60 { fmt.Printf("%v月 票價 %v 年齡 %v \n", month, price / 3, age) } else if age >= 18 { fmt.Printf("%v月 票價 %v 年齡 %v \n", month, price, age) } else { fmt.Printf("%v月 票價 %v 年齡 %v \n", month, price / 2, age) } } else { //淡季 if age >= 18 && age < 60 { fmt.Println("淡季成人票價 40") } else { fmt.Println("淡季兒童和老人票價 20") } } }
輸出結果如下圖所示:
(4) 使用switch語句實現:根據用戶輸入月份,輸出對應春夏秋冬季節。
代碼如下:
package main import "fmt" func main() { //季節判斷 var month byte fmt.Println("請輸入月份:") fmt.Scanln(&month) switch month { case 3, 4, 5: fmt.Println("Spring") case 6, 7, 8: fmt.Println("Summer") case 9, 10, 11: fmt.Println("Autumn") case 12, 1, 2: fmt.Println("Winter") default: fmt.Println("Error Input") } }
輸出結果如下圖所示:
(5) 求ax^2+bx+c=0方程的根。a、b、c分別為函數的參數,如果b^2-4ac>0,則有兩個解;如果b^2-4ac=0,則有一個解;否則無解。
提示:x1=(-b+sqrt(b^2-4ac))/2a
提示:x2=(-b-sqrt(b^2-4ac))/2a
注意,需要引入math.Sqrt(num)即可求平方根
package main import "fmt" import "math" func main() { /* 分析思路 1) a,b,c是給出的變量 2) 使用給出的數學公式和多分支語句計算 3) 導入math包計算平方根 */ var a float64 var b float64 var c float64 fmt.Println("請輸入abc三個變量") fmt.Scanf("%f %f %f", &a, &b, &c) fmt.Printf("a=%v b=%v c=%v \n", a, b, c) m := b * b - 4 * a * c if m > 0 { x1 := (-b + math.Sqrt(m)) / (2 * a) x2 := (-b - math.Sqrt(m)) / (2 * a) fmt.Printf("x1=%v x2=%v", x1, x2) } else if m == 0 { x1 := (-b + math.Sqrt(m)) / (2 * a) fmt.Printf("x1=%v", x1) } else { fmt.Printf("無解") } }
輸出結果如下圖所示:
五.總結
寫到這里,這篇基礎性Golang文章介紹完畢,希望您喜歡!祝大家新年快樂,牛氣沖天,也希望自己能分享更優秀、更深入的文章。
一.順序控制語句
二.條件控制語句
1.單分支控制
2.雙分支控制
3.多分支控制
4.嵌套分支
三.switch分支控制
四.編程練習
1.題目
2.答案
Go基本運算和進制轉換了解后,后面的文章將詳細介紹Go語言的條件語句和循環語句知識,并結合案例進行普及。希望這篇基礎性文章對您有幫助,寫得不好的地方還請海涵。同時非常感謝參考文獻中的大佬們的文章分享,尤其是韓順平老師,深知自己很菜,得努力前行。也希望自己能深入下去,未來四年好好研究Go編程語言,做更多實際工程,寫更好的文章,共勉!
源代碼-:
https://github.com/eastmountyxz/Go-learning
2020年在github的綠瓷磚終于貼完了第一年提交2100余次,獲得1500多+stars,開源93個倉庫,300個粉絲。挺開心的,希望自己能堅持在github打卡五年,督促自己不斷前行。簡單總結下,最滿意的資源是YQ爆發時,去年2月分享的輿情分析和情感分析,用這系列有溫度的代碼為武漢加油;最高贊的是Python圖像識別系列,也獲得了第一位來自國外開發者的貢獻補充;最花時間的是Wannacry逆向系列,花了我兩月逆向分析,幾乎成為了全網最詳細的該蠕蟲分析;還有AI系列、知識圖譜實戰、CVE復現、APT報告等等。當然也存在很多不足之處,希望來年分享更高質量的資源,也希望能將安全和AI頂會論文系列總結進來,真誠的希望它們能幫助到大家,感恩有你,一起加油~
感謝華為云的禮物,希望能與大家一起在華為云社區共同進步,且看且珍惜。
原文地址:https://blog.csdn.net/Eastmount/article/details/113804706
(By:娜璋AI之家 Eastmount 2021-08-10 星期二 夜于貴陽?)
參考文獻:
Go官網:https://golang.org/
韓老師視頻:https://www.bilibili.com/video/BV1pt41127FZ
https://www.runoob.com/go/go-tutorial.html
Go中文網在線標準庫文檔:https://studygolang.com/pkgdoc
《C程序設計》譚浩強老師
《GO高級編程》
Go
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。