一、條件語句
條件語句即if-else語句,通常用來判斷條件是否滿足,下面通過猜價格遊戲來了解條件語句:
1、猜價格遊戲
假如有一件商品價格爲81元,在[0,100]範圍之內
系統請猜測者輸入一個價格
猜測者:50
系統提示:低了
猜測者:87
系統提示:高了
猜測者:83
系統提示:高了
猜測者:81
系統提示:恭喜您猜對了
最終效果如下圖:
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,這段程序是編譯不能通過呢?還是可以正常運行?
從作用域上來看,該程序可以正常運行,在if條件語句中值爲10的變量a是不可見的,只能看到值爲3的變量a,但出了條件語句值爲10的變量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就不會出現這類問題,當它匹配到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")
}
我們定義了一個getValue()函數,並把返回值3賦值給變量i,顯示這是一個表達式,同時i <= 2或i <= 5也是表達式。值得一提的是3 <= 5同時3 <= 8,但程序只打印出滿足i <= 5的條件,然後就直接短路了。讀者若想不讓它直接短路該如何辦?這就需要fallthrough關鍵字了
5、fallthrough關鍵字
在case執行體內添加fallthrough關鍵字的作用是,當該case執行體執行後,還可以向下執行符合的條件,具體見截圖:
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語言的靈活性了吧 :)