代碼示例:html
sum := 0 for i, j := 0, 0; i <= 5 && j <= 5; i, j = i+1, j-1 { t.Log("i: ", i) t.Log("j: ", j) sum += i + j } t.Log("sum: ", sum)
Go中的控制語句較精簡,僅有if、for、select和switch。但使用時均比較靈活函數
在Go中條件語句*if*中若是條件部分的計算結果爲**true**時將執行語句塊,不然則執行else語句塊(若是存在else時),此邏輯和其餘語言中的if同樣,可是在Go中仍是有一些不一樣之處。post
賦值+條件判斷學習
if a, b := 21, 3; a > b { fmt.Println("a>b ? true") }
在if條件表達式前面聲明的的變量只能在if-else語句塊中使用。google
if a, b := 21, 31; a > b { fmt.Println("a>b ? true") }else { fmt.Println(a,b) //Ok } fmt.Println(a,b) //error: undefined a ,undefined b
還須要注意的是若是在if-else 中包含return 時,編譯器沒法解析出else中的retrun,致使方法缺乏return ,目前1.1版本已支持該方式。編碼
func getName(id int) string { if id == 1 { return "YourName" }else { return "MyName" } //panic("") }
此代碼編譯不經過,錯誤信息:function ends without a return statement,這是在設計Go時故意這樣的,也能夠說是一個Bug(可參見:https://code.google.com/p/go/issues/detail?id=65),這是一種編碼風格,即在if語句塊中去作return處理,而else中不處理,而是繼續執行if-else後面的代碼,這樣能減小一個代碼縮進,不須要在瞭解代碼時去記住else語句塊的處理。固然若是想必須這樣寫,也能夠進行特殊處理,在函數的末行添加語句**panic("")**spa
在if中能夠包含初始化語句,這是很是實用的。例如在文件處理,取字典項時須要判斷是否執行操做成功,只有在成功時才能繼續處理,這樣就能夠經過if-else處理。設計
if err := file.Chmod(0664); err != nil { log.Print(err) return err } if v,err :=myMap[key];err != nil { log.Print(err) return err }else { //do something with v }
在Go中其餘循環遍歷的控制語句,惟有for。而for一樣也是比較靈活的,for有三種形式。code
因爲Go沒有逗號表達式,而++和--是語句而不是表達式,若是想在for中執行多個變量,須要使用平行賦值htm
for i, j := 1, 10; i < j; i,j=i+1,j+1 { //死循環 fmt.Println(i) }
而不能寫成
for i, j := 1, 10; i < j; i++,j++ { fmt.Println(i) }
for的condition在每執行一次循環體時便會執行一次,所以在實際開發過程當中須要注意不要讓condition中計算簡單而不是複雜。
for i,j :=0,len(str); i<j ; i++ { fmt.Println(str[i]) }
而不要寫成(這僅是一個演示而已)
for i=0; i< len(str); i++ { fmt.Println(str[i]) }
另外for是遍歷string,array,slice,map,chanel的方式,而使用保留字rang則能靈活的處理。rang是迭代器,能根據不一樣的內容,返回不一樣的東西。
須要注意的是for+rang遍歷string時獲得的是字節索引位置和UTF-8格式rune類型數據(int32)。
for pos, value := range "Go在中國" { fmt.Printf("character '%c' type is %T value is %v, and start at byte position %d \n", value,value,value, pos) str :=string(value) //convert rune to string fmt.Printf("string(%v)=>%s \n",value,str) } ---------OutPut------------ 一個漢字佔三個字節 character 'G' type is int32 value is 71, and start at byte position 0 string(71)=>G character 'o' type is int32 value is 111, and start at byte position 1 string(111)=>o character '在' type is int32 value is 22312, and start at byte position 2 string(22312)=>在 character '中' type is int32 value is 20013, and start at byte position 5 string(20013)=>中 character '國' type is int32 value is 22269, and start at byte position 8 string(22269)=>國
另外在循環中使用break和continue,break用於退出循環,continue用於終止本次循環體的執行繼續執行下一個循環。
sum := 0 for { if sum > 10 { break } sum += 2 } fmt.Println(sum) // sum=12
break也可退出指定的循環體
sum := 0 myforLable: for { for i := 0; i < 10; i++ { if sum > 200 { break myforLable //將退出循環體for{} } sum += i } } fmt.Println(sum)
switch是最靈活的一種控制語句,表達式能夠不是常量或者字符串,也能夠沒有表達式,若是沒有表達式則如同if-else-else。
通常用法:和其餘語言的Switch基本同樣,不一樣的不須要在每一個Case中添加Break,而是隱藏了Break,固然你能夠顯示加入break
switch ch { case '0': cl = "Int" case '1': cl = "Int" case 'A': cl = "ABC" break //能夠添加 case 'a': cl = "ABC" default: cl = "Other Char" }
此段代碼能夠可寫成(fallthrough表示繼續執行下面的Case而不是退出Switch)
switch ch { case '0': fallthrough //必須是最後一個語句 case '1': cl = "Int" case 'A': case 'a': fallthrough cl = "ABC" //error default: cl = "Other Char" }
若是多個匹配結果所對應的代碼段同樣,則能夠在一個case中並列出全部的匹配項
switch ch { case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': cl = "Int" case 'A', 'B', 'C', 'D', 'a', 'b', 'c', 'd', 'e': cl = "ABC" default: cl = "Other Char" }
一樣switch能夠沒有表達式,在 Case 中使用布爾表達式,這樣形如 if-else
switch { case '0' <= ch && ch <= '9': cl = "Int" case ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z'): cl = "ABC" default: cl = "Other Char" }
下面是Switch寫的一個示例(無實際意義):
func Compare(a, b interface{}) (int, error) { aT := reflect.TypeOf(a) bT := reflect.TypeOf(b) if aT != bT { return -2, errors.New("進行比較的數據類型不一致") } switch av := a.(type) { default: return -2, errors.New("該類型數據比較沒有實現") case string: switch bv := b.(type) { case string: return ByteCompare(av, bv), nil } case int: switch bv := b.(type) { case int: return NumCompare(av, bv), nil } } return -2, nil }
還有另外一個控制語句select,在討論chan 時再來學習
參考資料:
http://www.cnblogs.com/howDo/archive/2013/06/01/GoLang-Control.html