Go流控制(一)

相对比java,go的流控制比较精简。
if...else...

func main() {
    x := 3
    if x > 5 {
        println("a")
    } else if x < 5 && x > 0 {
        println("b")
    } else {
        println("z")
    }
}

对初始化语句的支持

func main() {
    x := 10

    var xinit = func () {
        x = x -10
    }

    if xinit(); x == 0 {    //优先执行xint函数
        println("a")
    }

    if a, b := x+1, x+10; a < b {  //定义一个或多个局部变量(也可以是函数返回值)
        println(a)
    } else {
        println(b)
    }
}

switch

func main() {
    a, b, c, x := 1, 2, 3, 2

    switch x {             //将x与case条件匹配
    case a, b:             //多个匹配条件命中其一即可
        println("a | b")
    case c:                //单个匹配
        println("c")
    case 4:                //常量
        println("d")
    default:
        println("2")
    }
}

输出:

a | b

switch同样支持初始化语句,按从上到下、从左到右顺序匹配case执行。只有全部匹配失败时,才会执行default块。

func main() {
    switch x := 5; x {
    default:
        x += 100
        println(x)
    case 5:
        x += 50
        println(x)
    }
}

输出:

55

无须显式执行break语句,case执行完毕自动中断。如须贯通后续case,须执行fallthrough,但不再匹配后续条件表达式。

func main() {
    switch x := 5; x {
    default:
        println(x)
    case 5:
        x += 50
        println(x)
        fallthrough      //继续执行下一case。但不再匹配条件表达式
    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
    }
}

初始化语句仅被执行一次。条件表达式中如有函数调用,须确认是否会重复执行。

func count() int {
    print("count.")
    return 3
}
func main() {
    for i, c := 0, count(); i < c; i++ { //初始化语句的count函数仅执行一次
        println("a", i)
    }
    c := 0
    for c < count() {           //条件表达式中的count重复执行
        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完成数据迭代,支持字符串、数组、数组指针、切片、字典、通道类型,返回索引、键值数据。

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会复制目标数据。受直接影响的是数组,可改用数组指针或切片类型。

func main() {
    data := [3]int{10, 20, 30}
    for i, x := range data {  //从data复制品中取值
        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[:] { //仅复制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定点跳转

func main() {
    for i := 0; i < 3; i++ {
        println(i)
        if i > 1 {
            goto exit
        }
    }
    exit:
        println("exit.")
}

输出:

0
1
2
exit.

goto不能跳转到其他函数,或内层代码块内。
和goto定点跳转不同,break、continue用于中断代码块执行。

  • break:用于switch、for、select语句,终止整个语句块执行。
  • continue:仅用于for循环,终止后续逻辑,立即进入下一轮循环。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343