天天看點

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

一、條件語句

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

1、猜價格遊戲

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

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

猜測者:50

系統提示:低了

猜測者:87

系統提示:高了

猜測者:83

猜測者:81

系統提示:恭喜您猜對了

最終效果如下圖:

<a href="http://s3.51cto.com/wyfs02/M02/5A/39/wKiom1T6htSQ-26AAAC6fDkqqJY700.jpg" target="_blank"></a>

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", &amp;input)

      if input &lt; randrom {

         fmt.Println("低了")

      } else if input &gt; randrom {

         fmt.Println("高了")

      } else {

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

         break

      }

   }

   time.Sleep(time.Second * 10)

}

3、代碼解釋

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

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

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", &amp;input)

界面停止等待猜測者輸入價格,并把輸入的價格指派給input變量

if input &lt; randrom {

   fmt.Println("低了")

} else if input &gt; randrom {

   fmt.Println("高了")

} else {

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

   break

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

time.Sleep(time.Second * 10)

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

4、條件語句的使用

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

if (input &lt; randrom)

{

   System.out.println("低了")

else if (input &gt; randrom)

   System.out.println("高了")

else

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

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

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

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

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

if a := 1; a &lt; 2 {

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

if之後直接聲明了一個變量a,并把1指派給a,然後再判斷變量a是否小于2,若小于2則列印出資訊

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

   a := 10

   if a := 3; a &gt; 2 {

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

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

在main()函數中聲明了一個變量a并指派為10,同時在條件語句if後面也聲明了一個變量a并指派為3,這段程式是編譯不能通過呢?還是可以正常運作?

<a href="http://s3.51cto.com/wyfs02/M00/5A/60/wKiom1T67OzhZIy9AAB23EjEGmA369.jpg" target="_blank"></a>

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

<a href="http://s3.51cto.com/wyfs02/M01/5A/5C/wKioL1T68FDgSy3eAADc5n-4hg0275.jpg" target="_blank"></a>

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

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

2、變量i的類型

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

3、支援合并

上例比對條件可寫為:

case 0, 1, 2:

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

case 4, 5:

   fmt.Println("case 4 or 5")

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

switch i := getValue(); {

case i &lt;= 2:

case i &lt;= 5:

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

case i &lt;= 8:

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

<a href="http://s3.51cto.com/wyfs02/M02/5A/5C/wKioL1T7AI_T-P1rAABBI1I2wms590.jpg" target="_blank"></a>

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

5、fallthrough關鍵字

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

<a href="http://s3.51cto.com/wyfs02/M02/5A/60/wKiom1T7ASuQR0tUAAL9F8rM21g534.jpg" target="_blank"></a>

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

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

i := getValue()

switch {

   fallthrough

這裡把switch後面的内容清空了,但由于i值還需要存在,是以把i:=getValue()提到了switch的前面,這樣switch-case内就可以通路變量i了

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

<a href="http://down.51cto.com/data/2365479" target="_blank">附件:http://down.51cto.com/data/2365479</a>

     本文轉自qingkechina 51CTO部落格,原文連結:http://blog.51cto.com/qingkechina/1618317,如需轉載請自行聯系原作者