Go語言的控制結構比Java、C語言都要少,只有很簡單的幾個,語法與也略有不一樣。
數組
break default func interface select
case defer go map struct
chan else goto package switch
const fallthrough if range type
continue for import return var
學習
* / % << >> & &^ + - | ^ && || ! 優化
if中的條件不須要用中括號()給包含起來。 spa
a := 1 b := 2 c := 3 if a < b && b < c { fmt.Println(true) } else { fmt.Println(false) }
並且if接受初始化語句,初始化的變量爲一個局部變量。 code
if f, err := os.Open("c:/hello.go"); err == nil { fmt.Println(f.Name()) } else { fmt.Println(err) }
func myfunc() { i := 0 Lable: fmt.Println(i) i++ if i < 10 { goto Lable } }
Go中沒有while,do while循環,只有一個for,不過卻能夠完成各類靈活循環操做,一樣也不須要中括號包含。
依舊有break,continue關鍵字,用法和其它語言同樣。 索引
func main() { //跟Java類似的for循環 for i := 0; i < 10; i++ { fmt.Println(i) } //與While同樣 for false { } /死循環 for { } Here: for i := 0; i < 10; i++ { for j := 0; j < 10; j++ { fmt.Println(j) if j > 5 { break Here } } } }
range能夠用於對集合的循環,集合後面在繼續學習,先看一下用range來遍歷數組。 編譯器
var ss []string = []string{"aaa", "bbb", "ccc", "ddd"} for i, v := range ss { fmt.Printf("索引是%d, 值是:%s\n", i, v) }
Go的switch很靈活,不必定非要用常量,還支持表達式,下面一組代碼片段是判斷常量的。 string
func main() { i := 0 switch i { case 0: //若是不加這個關鍵字,若是i等於0不會進到下面的case 1中 fallthrough case 1: fmt.Println(111) } }
func main() { ch := 'b' switch ch { //多個值用逗號分隔 case 'a', 'b', 'c': fmt.Println(111) default: fmt.Println(222) } }下面這段代碼是 case表達式的
func main() { i := 10 switch { case i < 10: fmt.Println(111) case i < 20: fmt.Println(222) default: fmt.Println(333) } }很是靈活、強大的switch,可是也給我帶來一個疑問,Go的編譯器怎麼對switch進行編譯優化呢,假如說一個switch其中有幾百甚至上千個case,起不是要按照順序一個一個去匹配,時間複雜度就變成O(N)了,常量的switch好處就是能夠讓時間複雜度變成O(1)