[GO語言基礎] 五.順序控制語句和條件控制語句(if、else、switch)(go語言入門)

      網友投稿 968 2025-03-31

      這些年我學過各種編程語言,從最早的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.嵌套分支

      在一個分支結果中又完整嵌套另一個完整的分支結構,里面的分支結構稱為內層分支,外面的分支結構稱為外層分支。基本語法如下:

      [GO語言基礎] 五.順序控制語句和條件控制語句(if、else、switch)(go語言入門)

      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小時內刪除侵權內容。

      上一篇:Excel2010如何直接小數轉換為百分數加上百分號在其他行顯示(excel中把小數換成百分數)
      下一篇:「免費開源」基于Vue和Quasar的crudapi前端SPA項目實戰之動態表單(五)
      相關文章
      亚洲一级毛片在线观| 亚洲免费在线观看视频| 亚洲已满18点击进入在线观看| 亚洲AV日韩AV永久无码绿巨人 | 国产亚洲美女精品久久久| 亚洲AV无码片一区二区三区 | 亚洲高清一区二区三区| 亚洲人成网站日本片| 亚洲午夜国产精品无卡| 亚洲国产午夜精品理论片| 亚洲国产精品成人久久久| 亚洲精品**中文毛片| 亚洲图片中文字幕| 亚洲专区一路线二| 亚洲中文字幕无码爆乳app| 亚洲综合av一区二区三区| 亚洲成av人片在线天堂无| 亚洲GV天堂无码男同在线观看| 亚洲成a人无码亚洲成www牛牛| 亚洲av无码成人影院一区| 午夜亚洲国产理论片二级港台二级| 亚洲AV无码专区亚洲AV桃| 国产区图片区小说区亚洲区| 亚洲人成色7777在线观看不卡| 亚洲人成色77777在线观看大| 亚洲色精品vr一区二区三区| 国产精品亚洲аv无码播放| 久久久影院亚洲精品| 久久亚洲美女精品国产精品| 亚洲色偷偷av男人的天堂| 亚洲综合校园春色| 亚洲s码欧洲m码吹潮| mm1313亚洲精品国产| a级亚洲片精品久久久久久久| 亚洲av一综合av一区| 精品亚洲成a人片在线观看 | 亚洲国产成人久久笫一页| 久久亚洲国产成人影院网站| 亚洲国产精品成人精品无码区| 78成人精品电影在线播放日韩精品电影一区亚洲 | mm1313亚洲精品国产|