一、switch分支控制
switch
語句用於基於不同條件執行不同動作,每一個case
分支都是唯一的, 從上到下逐一測試,直到匹配爲止- 匹配項後面也不需要再加
break
語法:
switch表達式{
case 表達式1,表達式2,..:
語句塊1
case表達式3,表達式4,..:
語句塊2
//這裏可以有多個case語句
default:
語句塊
}
基本代碼:
var key byte
fmt.Println(”請輸入個字符 a,b,c,d,e,f,g")
fmt.Scanf("%c", &key)
switch key {
case 'a':
fmt.Print1n("週一,猴子穿新衣")
case 'b':
fmt.Println("週二,猴子當小二")
case 'c':
fmt.Print1n("週三,猴子爬雪山")
//...
default:
fmt.Print1n( "輸入有誤...")
}
switch 的使用的注意事項和細節:
case
/switch
後是一個表達式( 即:常量值、變量、一個有返回值的函數等都可以)case
後的各個表達式的值的數據類型,必須和switch
的表達式數據類型一致case
後面可以帶多個表達式,使用逗號間隔。比如case
表達式 1, 表達式 2 …case
後面的表達式如果是常量值(字面量),則要求不能重複case
後面不需要帶break
,程序匹配到一個case
後就會執行對應的代碼塊,然後退出switch
,如果一個都匹配不到,則執行default
default
語句不是必須的switch
穿透fallthrough
,如果在case
語句塊後增加fallthrough
,則會繼續執行下一個case
,也叫switch
穿透
var num int = 10
switch num {
case 10:
fmt.Println("ok1")
fallthrough //默認只能穿透層
case 20:
fmt.Println("ok2")
fallthrough
case 30:
fmt.Println("ok3")
default :
fmt.Println("沒有匹配到..")
}
Type Switch
:switch
語句還可以被用於type-switch
來判斷某個interface
變量中實際指向的變量類型
var x interface{}
var y = 10.0
x=y
switch i := x.(type) {
case nil:
fmt.Printf(" x的類型~ :%T",i)
case int:
fmt.Printf("x是int型")
case float64:
fmt.Printf("x是float64型")
case func(int) float64:
fmt.Printf("x是func(int)型")
case bool,string:
fmt.Printf("x是bool或string型”)
default:
fmt.Printf("未知型")
二、for循環控制
語法:
①第一種
for 循環變量初始化;循環條件;循環變量迭代 {
循環操作(語句)
}
for i:=1;i<=10;i++{
fmt.Print1n("Hello ",i)
}
②第二種
for 循環判斷條件 {
//循環執行語句
}
j:=1
for j<=10{
fmt.Println("Hello ",j)
j++
}
③第三種
for {
//循環執行語句
}
上面的寫法等價for;; {}
是一個無限循環, 通常需要配合break
語句使用
k :=1
for{//這裏也等價for;;{
if k<=10 {
fmt.Print1n("ok~~", k)
} else {
break
}
k++
}
④第四種
Go
提供for-range
的方式,可以方便遍歷字符串和數組
str := "hello"
for index, val := range str {
fmt.Printf("index=%d,val=%c \n", index, val)
}
輸出:
如果我們的字符串含有中文,那麼傳統的遍歷字符串方式,就是錯誤,會出現亂碼。原因是傳統的對字符串的遍歷是按照字節來遍歷,而一個漢字在utf8
編碼是對應3個字節。 如何解決需要:將str
轉成[]rune
切片。
str := "你好,go"
str2 := []rune(str)
for i := 0; i < len(str2); i++ {
fmt.Printf("%c \n", str2[i])
}
對應for-range
遍歷方式而言,是按照字符方式遍歷。因此如果有字符串有中文也是支持的。
str := "你好,Go"
for index, val := range str {
fmt.Printf("index=%d,val=%c \n", index, val)
}
三、跳轉控制語句goto
Go
語言的goto
語句可以無條件地轉移到程序中指定的行goto
語句通常與條件語句配合使用。可用來實現條件轉移,跳出循環體等功能- 在
Go
程序設計中一般不主張使用goto
語句, 以免造成程序流程的混亂,使理解和調試程序產生困難
語法:
goto label
...
label:statement
案例:
func main() {
n := 30
//演示goto的使用
fmt.Println("ok1")
if n > 20 {
goto label1
}
fmt.Println("ok2")
fmt.Println(" ok3")
fmt.Println(" ok4")
label1:
fmt.Println("ok5")
fmt.Println("ok6")
fmt.Println("ok7")
}