美文网首页Go Lang 实战
Go流控制(一)

Go流控制(一)

作者: 草莓君_ | 来源:发表于2019-07-31 11:28 被阅读0次

    相对比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循环,终止后续逻辑,立即进入下一轮循环。

    相关文章

      网友评论

        本文标题:Go流控制(一)

        本文链接:https://www.haomeiwen.com/subject/sbyorctx.html