Go流控制(一)

相對(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)泰鸡。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市壳鹤,隨后出現(xiàn)的幾起案子盛龄,更是在濱河造成了極大的恐慌,老刑警劉巖芳誓,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件余舶,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡锹淌,警方通過查閱死者的電腦和手機(jī)匿值,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赂摆,“玉大人挟憔,你說我怎么就攤上這事钟些。” “怎么了绊谭?”我有些...
    開封第一講書人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵政恍,是天一觀的道長。 經(jīng)常有香客問我龙誊,道長抚垃,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任趟大,我火速辦了婚禮鹤树,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘逊朽。我一直安慰自己罕伯,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開白布叽讳。 她就那樣靜靜地躺著追他,像睡著了一般。 火紅的嫁衣襯著肌膚如雪岛蚤。 梳的紋絲不亂的頭發(fā)上邑狸,一...
    開封第一講書人閱讀 49,829評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音涤妒,去河邊找鬼单雾。 笑死,一個(gè)胖子當(dāng)著我的面吹牛她紫,可吹牛的內(nèi)容都是我干的硅堆。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼贿讹,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼渐逃!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起民褂,我...
    開封第一講書人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤茄菊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后助赞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體买羞,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年雹食,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了畜普。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡群叶,死狀恐怖吃挑,靈堂內(nèi)的尸體忽然破棺而出钝荡,到底是詐尸還是另有隱情,我是刑警寧澤舶衬,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布埠通,位于F島的核電站,受9級(jí)特大地震影響逛犹,放射性物質(zhì)發(fā)生泄漏端辱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一虽画、第九天 我趴在偏房一處隱蔽的房頂上張望舞蔽。 院中可真熱鬧,春花似錦码撰、人聲如沸渗柿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽朵栖。三九已至,卻和暖如春柴梆,著一層夾襖步出監(jiān)牢的瞬間陨溅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來泰國打工绍在, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留声登,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓揣苏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親件舵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子卸察,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349