相對(duì)比java,go的流控制比較精簡。
if...else...
func main() {
x := 3
if x > 5 {
println("a")
} else if x < 5 && x > 0 {
println("b")
} else {
println("z")
}
}
對(duì)初始化語句的支持
func main() {
x := 10
var xinit = func () {
x = x -10
}
if xinit(); x == 0 { //優(yōu)先執(zhí)行xint函數(shù)
println("a")
}
if a, b := x+1, x+10; a < b { //定義一個(gè)或多個(gè)局部變量(也可以是函數(shù)返回值)
println(a)
} else {
println(b)
}
}
switch
func main() {
a, b, c, x := 1, 2, 3, 2
switch x { //將x與case條件匹配
case a, b: //多個(gè)匹配條件命中其一即可
println("a | b")
case c: //單個(gè)匹配
println("c")
case 4: //常量
println("d")
default:
println("2")
}
}
輸出:
a | b
switch同樣支持初始化語句,按從上到下、從左到右順序匹配case執(zhí)行统倒。只有全部匹配失敗時(shí),才會(huì)執(zhí)行default塊氛雪。
func main() {
switch x := 5; x {
default:
x += 100
println(x)
case 5:
x += 50
println(x)
}
}
輸出:
55
無須顯式執(zhí)行break語句房匆,case執(zhí)行完畢自動(dòng)中斷。如須貫通后續(xù)case报亩,須執(zhí)行fallthrough浴鸿,但不再匹配后續(xù)條件表達(dá)式。
func main() {
switch x := 5; x {
default:
println(x)
case 5:
x += 50
println(x)
fallthrough //繼續(xù)執(zhí)行下一case弦追。但不再匹配條件表達(dá)式
case 6:
x += 10
println(x)
}
}
輸出:
55
65
for
func main() {
for i := 0;i < 3;i++ {
println(i)
}
x := 1
for x < 10 { //類似while x < 10
x ++
println(x)
}
for { //類似于while true {}
break
}
}
初始化語句僅被執(zhí)行一次岳链。條件表達(dá)式中如有函數(shù)調(diào)用,須確認(rèn)是否會(huì)重復(fù)執(zhí)行劲件。
func count() int {
print("count.")
return 3
}
func main() {
for i, c := 0, count(); i < c; i++ { //初始化語句的count函數(shù)僅執(zhí)行一次
println("a", i)
}
c := 0
for c < count() { //條件表達(dá)式中的count重復(fù)執(zhí)行
println("b", c)
c++
}
}
輸出:
count.a 0
a 1
a 2
count.b 0
count.b 1
count.b 2
count.
for...range
可用for...range完成數(shù)據(jù)迭代掸哑,支持字符串约急、數(shù)組、數(shù)組指針苗分、切片厌蔽、字典、通道類型摔癣,返回索引奴饮、鍵值數(shù)據(jù)。
func main() {
data := [3]string{"a","b","c"}
for i, s := range data {
println(i, s)
}
}
輸出:
0 a
1 b
2 c
允許返回單值择浊,或用"_"忽略
func main() {
data := [3]string{"a","b","c"}
for i := range data { //只返回value
println(i, data[i])
}
for _, s := range data { //忽略索引
println(s)
}
for range data { //僅迭代不返回
}
}
輸出:
0 a
1 b
2 c
a
b
c
注意戴卜,range會(huì)復(fù)制目標(biāo)數(shù)據(jù)。受直接影響的是數(shù)組琢岩,可改用數(shù)組指針或切片類型投剥。
func main() {
data := [3]int{10, 20, 30}
for i, x := range data { //從data復(fù)制品中取值
if i == 0 {
data[0] += 100
data[1] += 200
data[2] += 300
}
fmt.Printf("x: %d, data: %d\n", x, data[i])
}
for i, x := range data[:] { //僅復(fù)制slice, 不包括底層array
if i == 0 {
data[0] += 100
data[1] += 200
data[2] += 300
}
fmt.Printf("x: %d, data: %d\n", x, data[i])
}
}
輸出:
x: 10, data: 110
x: 20, data: 220
x: 30, data: 330
x: 110, data: 210
x: 420, data: 420
x: 630, data: 630
goto,continue粘捎,break
goto定點(diǎn)跳轉(zhuǎn)
func main() {
for i := 0; i < 3; i++ {
println(i)
if i > 1 {
goto exit
}
}
exit:
println("exit.")
}
輸出:
0
1
2
exit.
goto不能跳轉(zhuǎn)到其他函數(shù)薇缅,或內(nèi)層代碼塊內(nèi)。
和goto定點(diǎn)跳轉(zhuǎn)不同攒磨,break、continue用于中斷代碼塊執(zhí)行汤徽。
- break:用于switch娩缰、for、select語句谒府,終止整個(gè)語句塊執(zhí)行拼坎。
- continue:僅用于for循環(huán),終止后續(xù)邏輯完疫,立即進(jìn)入下一輪循環(huán)泰鸡。