Go:程序流程控制

一、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 的使用的注意事項和細節:

  1. case/switch後是一個表達式( 即:常量值、變量、一個有返回值的函數等都可以)
  2. case後的各個表達式的值的數據類型,必須和switch的表達式數據類型一致
  3. case 後面可以帶多個表達式,使用逗號間隔。比如 case表達式 1, 表達式 2 …
  4. case後面的表達式如果是常量值(字面量),則要求不能重複
  5. case後面不需要帶break,程序匹配到一個case後就會執行對應的代碼塊,然後退出switch,如果一個都匹配不到,則執行default
  6. default語句不是必須的
  7. 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("沒有匹配到..")
}

  1. Type Switchswitch語句還可以被用於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")
}

在這裏插入圖片描述

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