【Go語言】【8】GO語言的條件語句和選擇語句

一、條件語句

條件語句即if-else語句,通常用來判斷條件是否滿足,下面通過猜價格遊戲來了解條件語句:

1、猜價格遊戲

假如有一件商品價格爲81元,在[0,100]範圍之內

系統請猜測者輸入一個價格

猜測者:50

系統提示:低了

猜測者:87

系統提示:高了

猜測者:83

系統提示:高了

猜測者:81

系統提示:恭喜您猜對了

最終效果如下圖:

wKiom1T6htSQ-26AAAC6fDkqqJY700.jpg


2、猜價格代碼實現

package main

import (

   "fmt"

   "math/rand"

   "time"

)

func main() {

   randrom := rand.Intn(100)

   fmt.Println("請輸入0至100範圍內的整數價格")


   for {

      var input int

      fmt.Scanf("%d\n", &input)

      if input < randrom {

         fmt.Println("低了")

      } else if input > randrom {

         fmt.Println("高了")

      } else {

         fmt.Println("恭喜您猜對了")

         break

      }

   }


   time.Sleep(time.Second * 10)

}


3、代碼解釋

在GOROOT環境變量的src目錄創建guess.go文件(GOROOT的介紹可參見《【1】windows操作系統下GO環境配置

package main

表示guess.go所屬的包爲main包,包是GO語言中的基本單位,要生成GO可執行程序,必須建立一個名稱爲main的包,並且該包中必須包含一個叫main()的函數,它是GO可執行程序的入口

import (

   "fmt"

   "math/rand"

   "time"

)

表示該程序引入三個依賴包,依次爲fmt、math/rand和time。其中fmt即爲GO的標準格式包,主要負責輸入輸出用的; math/rand是GO的math隨機數包;time是GO的計時包,一般用於併發

func main() {

}

GO語言的main()函數,不能帶參數,也不能定義返回值,並且一個包中只能有一個main()函數

randrom := rand.Intn(100)

這裏調用了math/rand包中的Intn()函數,用於生成一個0~100範圍內的整數,並把這個整數賦值給變量randrom

fmt.Println("請輸入0至100範圍內的整數價格")

調用fmt包中的Println()函數,輸出提示信息

for {

}

無限循環,相當於其它語言的while,可能您會問:“哪爲何不使用while”,很遺憾地告訴您:“GO語言實在太扣門了,它沒有提供while關鍵字,它認爲一個for就足夠了”

var input int

fmt.Scanf("%d\n", &input)

界面停止等待猜測者輸入價格,並把輸入的價格賦值給input變量

if input < randrom {

   fmt.Println("低了")

} else if input > randrom {

   fmt.Println("高了")

} else {

   fmt.Println("恭喜您猜對了")

   break

}

如果輸入價格低於隨機數,系統則提示猜測者給的價格低了;若輸入價格高於隨機數,系統則提示猜測者給的價格高了;否則提示猜測正確,然後退出無限循環

time.Sleep(time.Second * 10)

猜測者猜對之後界面停止10秒後退出


4、條件語句的使用

此條件語句使用Java寫應該如下:

if (input < randrom)

{

   System.out.println("低了")

else if (input > randrom)

{

   System.out.println("高了")

}

else

{

   System.out.println("恭喜您猜對了")

}

通過與Java語法對比,更能清楚地瞭解到GO語法

  • if或else if之後的條件不需要括號括起來

  • 條件右側的左大括號與條件必須在同一行

除此之外,GO語言的if之後還可以初始化表達式,例如:

if a := 1; a < 2 {

    fmt.Println("if之後可以根初始化表達式")

}

if之後直接聲明瞭一個變量a,並把1賦值給a,然後再判斷變量a是否小於2,若小於2則打印出信息


5、條件語句中的變量作用域

func main() {

   a := 10

   if a := 3; a > 2 {

      fmt.Println("條件語句中變量a的值爲", a)

   }

   fmt.Println("main()函數中變量a的值爲", a)

}

在main()函數中聲明瞭一個變量a並賦值爲10,同時在條件語句if後面也聲明瞭一個變量a並賦值爲3,這段程序是編譯不能通過呢?還是可以正常運行?

wKiom1T67OzhZIy9AAB23EjEGmA369.jpg

從作用域上來看,該程序可以正常運行,在if條件語句中值爲10的變量a是不可見的,只能看到值爲3的變量a,但出了條件語句值爲10的變量a就變爲可見的了,其作用域如下:

wKioL1T68FDgSy3eAADc5n-4hg0275.jpg


6、猜價格遊戲的補充說明

   在使用Sublime text進行編譯時,先按ctrl + b,然後輸入go build guess.go(請注意:這裏是build命令),這個命令可以生成一個guess.exe文件,然後雙擊打開該guess.exe文件即可。

   關於GO的命令行工具後面找個專門章節來介紹 :)


二、選擇語句

這裏的選擇語句是指switch-case語句,有過其它語言開發經驗的讀者對此並不陌生

switch i {

case 0:

   fmt.Println("case 0")

case 1:

   fmt.Println("case 1")

case 2:

   fmt.Println("case 2")

case 3:

   fmt.Println("case 3")

case 4:

   fmt.Println("case 4")

case 5:

   fmt.Println("case 5")

default:

   fmt.Println("default")

}


1、沒有break語句

其它大部分語言在每個case語句中要增加break,否則會出現問題,假設變量i的值爲3,輸出結果就會變爲:

case 3

default

這並不是程序開發者所期望的y_0009.gif,但GO就不會出現這類問題,當它匹配到3時就直接短路了,後面的語句就不再執行了


2、變量i的類型

拿Java爲例,在JDK7之前變量i的值必須爲char或int,不支持String,但對於GO來說不僅支持string,而且支持任何類型


3、支持合併

上例匹配條件可寫爲:

switch i {

case 0, 1, 2:

   fmt.Println("case 0 or 1 or 2")

case 3:

   fmt.Println("case 3")

case 4, 5:

   fmt.Println("case 4 or 5")

default:

   fmt.Println("default")

}


4、switch和case後面可以是表達式

switch i := getValue(); {

case i <= 2:

   fmt.Println("case 0 or 1 or 2")

case i <= 5:

   fmt.Println("case 3 or 4 or 5")

case i <= 8:

   fmt.Println("case 6 or 7 or 8")

default:

   fmt.Println("default")

}

wKioL1T7AI_T-P1rAABBI1I2wms590.jpg

我們定義了一個getValue()函數,並把返回值3賦值給變量i,顯示這是一個表達式,同時i <= 2或i <= 5也是表達式。值得一提的是3 <= 5同時3 <= 8,但程序只打印出滿足i <= 5的條件,然後就直接短路了。讀者若想不讓它直接短路該如何辦?這就需要fallthrough關鍵字了


5、fallthrough關鍵字

在case執行體內添加fallthrough關鍵字的作用是,當該case執行體執行後,還可以向下執行符合的條件,具體見截圖:

wKiom1T7ASuQR0tUAAL9F8rM21g534.jpg


6、switch後面的條件可以去除

    在上例中switch後面跟着i:=getValue();表達式,細心的讀者估計已發現函數getValue()後面還有一個分號(;),若沒這個分號GO編譯器會報錯。初次寫這種表達式的人一開始可能很不舒服,所以GO語言提供了另外一種解決方案,即switch後面可以沒有內容

i := getValue()

switch {

case i <= 2:

   fmt.Println("case 0 or 1 or 2")

case i <= 5:

   fmt.Println("case 3 or 4 or 5")

   fallthrough

case i <= 8:

   fmt.Println("case 6 or 7 or 8")

   fallthrough

default:

   fmt.Println("default")

}

這裏把switch後面的內容清空了,但由於i值還需要存在,所以把i:=getValue()提到了switch的前面,這樣switch-case內就可以訪問變量i了


通過switch選擇語句,讀者一定能再次體會到GO語言的靈活性了吧 :)



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章