Go语言基础之4--流程控制
一、if else語句
1.1 基本語法1
語法1:
if condition { //do something }語法2:
if condition { //do something } else { //do something }語法3:
if condition { //do something } else if condition { //do something } else { //do something }?1.2 練習1
package mainimport ("fmt" )func main() {num := 10if num%2 == 0 {fmt.Println("the number is even")} else {fmt.Println("the number is odd")} }?執行結果如下:
1.3 基本語法2
if statement(語句); condition { }1.4 練習2
package mainimport ("fmt" )func main() {if num := 10;num%2 == 0 {fmt.Println("the number is even")} else {fmt.Println("the number is odd")} }?執行結果如下:
1.5 練習3
package mainimport ("fmt" )func main() {num := 99if num <= 50 {fmt.Println("number is less than or equal to 50")} else if num >= 51 && num <= 100 {fmt.Println("number is between 51 and 100")} else {fmt.Println("number is greater than 100")} }?執行結果如下:
二、 循環
2.1 Go語言中只有一種循環,就是for循環
基本語法:
for initialisation(初始化變量); condition(條件判斷); post(變量修改) { }?
2.1 練習1
package mainimport ("fmt" )func main() {for i := 1; i <= 10; i++ {fmt.Printf("%d", i)} }?執行結果如下:
2.3 break,終止循環
一句話說:break就是終止本層的循環
2.4 練習2(break)
package mainimport ("fmt" )func main() {for i := 1; i <= 10; i++ {if i > 5 {break //loop is terminated if i > 5 }fmt.Printf("%d ", i)}fmt.Printf("\nline after for loop") }執行結果如下:
2.5 continue,終止本次循環
一句話,continue是終止此次循環(跳過本次)。
2.6 練習3(continue)
package mainimport ("fmt" )func main() {for i := 1; i <= 10; i++ {if i%2 == 0 {continue}fmt.Printf("%d ", i)} }?執行結果如下:
2.7 練習4
package mainimport ("fmt" )func main() {i := 0for ;i <= 10; { // 初始化變量和變量修改也可以在這一行忽略,將初始化變量寫到for循環外,變量修改寫到for循環外,";"可以省略也可以寫上fmt.Printf("%d ", i)i += 2} }?執行結果如下:
2.8 練習5
package mainimport ("fmt" )func main() {for no, i := 10, 1; i <= 10 && no <= 19; i, no = i+1, no+1 {fmt.Printf("%d * %d = %d\n", no, i, no*i)} }?執行結果如下:
2.9 無限循環
就是for循環不寫任何條件
2.10 練習6(無限循環)
package mainimport ("fmt" )func main() {for { //for循環不加任何條件即為無限循環fmt.Printf("hello")} }?
執行結果如下:
package mainimport ("fmt" )func main() {for { //for循環不加任何條件即為無限循環fmt.Printf("hello")} }?執行結果如下:
尷尬的是:vscode也跑掛了。
三、 switch語句
3.1 switch語句語法
switch 語句用于基于不同條件執行不同動作,每一個 case 分支都是唯一的,從上直下逐一測試,直到匹配為止。。
switch 語句執行的過程從上至下,直到找到匹配項,匹配項后面也不需要再加break
基本語法是:
switch var1 {case val1:...case val2:...default:... }?解釋:
變量 var1 可以是任何類型,而 val1 和 val2 則可以是同類型的任意值。類型不被局限于常量或整數,但必須是相同的類型;或者最終結果為相同類型的表達式。也可以同時測試多個可能符合條件的值,使用逗號分割它們,例如:case val1, val2, val3。default是默認值,可以寫也可以不寫。
?
switch語句流程圖如下:
?
3.2 練習1(不加default)
package mainimport ("fmt" )func main() {finger := 4switch finger {case 1:fmt.Println("Thumb") //此處寫多行語句也可以case 2:fmt.Println("Index")case 3:fmt.Println("Middle")case 4:fmt.Println("Ring")case 5:fmt.Println("Pinky")} }?執行結果如下:
3.3 練習2(switch default)
package mainimport ("fmt" )func main() {switch finger := 8; finger {case 1:fmt.Println("Thumb")case 2:fmt.Println("Index")case 3:fmt.Println("Middle")case 4:fmt.Println("Ring")case 5:fmt.Println("Pinky")default: //default case,當上述case選項都不符合時,執行這里語句fmt.Println("incorrect finger number")} }?執行結果如下:
3.4 練習3(case值為多個條件)
package mainimport ("fmt" )func main() {letter := "i"switch letter {case "a", "e", "i", "o", "u":fmt.Println("vowel")default:fmt.Println("not a vowel")} }?執行結果如下:
3.5 練習4(case條件判斷)
package mainimport ("fmt" )func main() {num := 75switch { // expression is omitted(表達式省略掉了)case num >= 0 && num <= 50:fmt.Println("num is greater than 0 and less than 50")case num >= 51 && num <= 100:fmt.Println("num is greater than 51 and less than 100")case num >= 101:fmt.Println("num is greater than 100")} }?執行結果如下:
3.6 練習4(fallthrough)
switch 語句執行的過程從上至下,直到找到匹配項,匹配項后面也不需要再加break,如果case1已經滿足條件了,但是還想執行case2的話,我們可以通過使用fallthrough關鍵字,同理如果還想繼續執行case3的話,那我們可以接著使用fallthrough
實例如下:
package mainimport ("fmt" )func number() int {num := 15 * 5return num } func main() {switch num := number(); { //num is not a constantcase num < 50:fmt.Printf("%d is lesser than 50\n", num)fallthroughcase num < 100:fmt.Printf("%d is lesser than 100\n", num)fallthroughcase num < 200:fmt.Printf("%d is lesser than 200", num)} }執行結果如下:
四、 練習題
生成一個隨機數,讓一個用戶去猜這個數是多少?
代碼示例如下:
package mainimport ("fmt""math/rand" //math包中的rand函數可以用來生成隨機數"time" )func main() {var number int/*for i := 0;i < 10; i++ {number = rand.Intn(100)fmt.Printf("number:%d\n",number)}因為偽隨機的存在,rand生成的隨機數都有一個固定的序列,比如第一次生成1,第二次生成20等等,隨機數的序列是固定,我們可以通過給其一個隨機的總值,如果隨機的總值不一樣,那么偽隨機數的序列也不一樣。我們不給,他就是按照一個默認的隨機總值,所以偽隨機數序列永遠是一樣的。*/rand.Seed(time.Now().UnixNano()) //通過rand函數的Seed方法,來設置總值,這里我們以當前時間來設置總值,并且用的納秒,十分精確了number = rand.Intn(100) //隨機數的范圍是0-100,但不包括100fmt.Printf("請猜一個數字,數字的范圍是:[0-100)\n")for { //因為并不知道用戶什么時候輸入正確,所以是沒有限制條件的,我們只能做一個死循環,配合switch語句滿足條件了即可退出;var input intfmt.Scanf("%d\n", &input) //Scanf表示讓用戶輸入,Scanf從終端讀取一個整數,并傳值給input變量,&表示獲取到該變量內存地址var flag bool = false //通過設置flag變量,解決的是用戶輸入正確后可以退出 switch {case number > input:fmt.Printf("您輸入的數字太小\n")case number == input:fmt.Printf("恭喜您,答對了!\n")flag = truecase number < input:fmt.Printf("您輸入的數字太大\n")}if flag { //表示如果flag為真,則break退出這個for循環 break}} }?執行結果如下:
?
補充:
Scanf哪里一定要加上\n,因為加上的話就已經表示以回車換行符為止,這樣就已經保證了能夠獲取到用戶輸入的真正的數字,你如果不加\n,他就不行了,就會識別2次一個是你輸入的數字,一個是回車。
4.2 補充1:
為什么等待用戶輸入的變量要加上&符號?
答:
如果我們去掉&,不傳入地址的話,我們是修改不了input的變量的值,假如我傳入一個test值進去,因為數據類型時int,其也就是值類型,這一次傳值,其內部就相當于拷貝了一份,這一份我們就可以稱其為b1,我們修改的僅僅是b1的值,并不是外面input變量的值,input變量的值并沒有修改。
4.3 補充2:
針對Go語言中基本數據類型是值類型的實例:
package mainimport ("fmt" )func main() {var a int = 100var b intb = ab = 200fmt.Printf("a=%d,b=%d, a=%p, b=%p", a, b, &a, &b) }?執行結果:
解釋:
變量a賦值100,變量b暫未賦值,然后將a變量復制給b,此時b為100,下面又重新為b變量賦值200,最終輸出結果a為100,b為200。因為a和b都是值類型,所以a和b的內存地址都是相互獨立的,如果不是獨立的,那么當b重新賦值為200時,a也應該是200了,但是a為100,也充分證明了,a和b的內存地址是相互獨立的。
4.4 補充3
1)Go語言中的基本數據類型都是值類型。
? ? ?值類型:定義一個變量a,在定義一個變量b,將 a=b(b賦值給a),對于值類型來說,此時雖然b賦值給a了,但是a和b依然是兩塊獨立的內存地址
2)我們都知道設置變量是為了我們去方便操作內存,在底層其都是一個個內存地址,我們cpu尋址的話,都是通過內存地址去尋址的,打印出來的內存地址都是16進制的串。比如說變量a=100,在計算機內部, ? ? ?我們是通過內存地址找到那塊內存,然后那塊內存是int類型,其占4個字節,找到那塊內存,找到那4個字節,然后把100存進去就可以了,go語言就是這樣比較原始。
轉載于:https://www.cnblogs.com/forever521Lee/p/9298871.html
總結
以上是生活随笔為你收集整理的Go语言基础之4--流程控制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HackerRank 算法刷题笔记(一)
- 下一篇: 邻接矩阵转可达矩阵