1. if else
在Go語言中,關鍵字if是用于測試某個條件(布爾型或邏輯型)的語句,如果該條件成立,則會執行 if 后由大括號{}括起來的代碼塊,否則就忽略該代碼塊繼續執行后續的代碼。
if condition {// 條件為真執行
}
condition 稱之為條件表達式或者布爾表達式,執行結果需返回true或false。{ 必須在條件表達式的尾部
x := 0if x <= 0 {fmt.Println("為真進入這里")}
如果存在第二個分支,則可以在上面代碼的基礎上添加 else 關鍵字以及另一代碼塊,這個代碼塊中的代碼只有在條件不滿足時才會執行,if 和 else 后的兩個代碼塊是相互獨立的分支,只能執行其中一個。
if condition {// 條件為真 執行
} else {// 條件不滿足 執行
}
x := 5if x <= 0 {fmt.Println("為真進入這里")//go語言格式要求很嚴,else必須寫在}后面}else{fmt.Println("為假進入這里")}
如果存在第三個分支,則可以使用下面這種三個獨立分支的形式:
if condition1 {// condition1 滿足 執行
} else if condition2 {// condition1 不滿足 condition2滿足 執行
}else {// condition1和condition2都不滿足 執行
}
else if 分支的數量是沒有限制的,但是為了代碼的可讀性,還是不要在 if 后面加入太多的 else if 結構
if語句可以嵌套:
/* 定義局部變量 */var a int = 100var b int = 200/* 判斷條件 */if a == 100 {/* if 條件語句為 true 執行 */if b == 200 {/* if 條件語句為 true 執行 */fmt.Printf("a 的值為 100 , b 的值為 200\n" )}}
1.1 特殊寫法
if 還有一種特殊的寫法,可以在 if 表達式之前添加一個執行語句,再根據變量值進行判斷,代碼如下:
if a := 10; a > 5 {fmt.Println(a) //10}
這種寫法可以將返回值與判斷放在一行進行處理,而且返回值的作用范圍被限制在 if、else 語句組合中。
在編程中,變量的作用范圍越小,所造成的問題可能性越小,每一個變量代表一個狀態,有狀態的地方,狀態就會被修改,函數的局部變量只會影響一個函數的執行,但全局變量可能會影響所有代碼的執行狀態,因此限制變量的作用范圍對代碼的穩定性有很大的幫助
2. for
go語言中的循環語句只支持 for 關鍵字,這個其他語言是不同的。
sum := 0
//i := 0; 賦初值,i<10 循環條件 如果為真就繼續執行 ;i++ 后置執行 執行后繼續循環
for i := 0; i < 10; i++ {sum += i
}
第二種寫法:
sum := 0
for {sum++if sum > 100 {//break是跳出循環break}
}
上述的代碼,如果沒有break跳出循環,那么其將無限循環
第三種寫法:
n := 10
for n>0 {n--fmt.Println(n)
}
我們來看下面一種寫法:
step := 2
//初值可以省略,但是;必須有,但是這樣寫step的作用域就比較大了,脫離了for循環
for ; step > 0; step-- {fmt.Println(step)
}
進一步簡化代碼,將 if 判斷整合到 for 中,變為下面的代碼:
step := 2
for step > 0 {step--fmt.Println(step)
}
結束循環的方法:break,return,goto,panic
其中,return和panic不會執行循環之后的語句,break會繼續執行
3. for range
for range 結構是Go語言特有的一種的迭代結構,for range 可以遍歷數組、切片、字符串、map 及管道(channel)
for key, val := range coll {...
}
val 始終為集合中對應索引的值拷貝,因此它一般只具有只讀性質,對它所做的任何修改都不會影響到集合中原有的值
str := "你好呀"for k, v := range str {fmt.Println(k, string(v))}
通過 for range 遍歷的返回值有一定的規律:
- 數組、切片、字符串返回索引和值。
- map 返回鍵和值。
- channel只返回管道內的值。
以下和c無太大區別
4. switch
go里面switch默認相當于每個case最后帶有break,匹配成功后不會自動向下執行其他case,而是跳出整個switch, 那么如何做到執行完一個case之后,進入下一個case而不是跳出swtich呢?
答案是:fallthrough
var s = "hello"
switch {
case s == "hello":fmt.Println("hello")fallthrough
case s != "world":fmt.Println("world")
}
5. goto
goto 語句通過標簽進行代碼間的無條件跳轉
使用 goto 退出多層循環
使用 goto 集中處理錯誤
6. break
break 語句可以結束 for、switch 和 select 的代碼塊,另外 break 語句還可以在語句后面添加標簽,表示退出某個標簽對應的代碼塊,標簽要求必須定義在對應的 for、switch 和 select 的代碼塊上。
func main() {
OverLoop:for i := 0; i < 2; i++ {for j := 0; j < 5; j++ {switch j {case 2:fmt.Println(i, j)break OverLoopcase 3:fmt.Println(i, j)break OverLoop}}}
}
//0 2
7. continue
continue 語句可以結束當前循環,開始下一次的循環迭代過程,僅限在 for 循環內使用,在 continue 語句后添加標簽時,表示開始標簽對應的循環
package main
import "fmt"
func main() {
OuterLoop:for i := 0; i < 2; i++ {for j := 0; j < 5; j++ {switch j {case 2:fmt.Println(i, j)continue OuterLoop}}}
}