一、條件語句
條件語句即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", &input)
if input < randrom {
fmt.Println("低了")
} else if input > 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", &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、條件語句中的變量作用域
a := 10
if a := 3; a > 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
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiYWan5SOwADMfl3LcFWdvl3LclGavwVbvNmL1RWahJmLn1Wavw1LcpDc0RHaiojIsJye.gif)
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 <= 2:
case i <= 5:
fmt.Println("case 3 or 4 or 5")
case i <= 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 <= 2或i <= 5也是表達式。值得一提的是3 <= 5同時3 <= 8,但程式隻列印出滿足i <= 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,如需轉載請自行聯系原作者