Go语言流程控制中的break,continue和goto(七)

break(跳出循环)

break用于跳出整个循环,如下:

func main() {
    for i:=0;i<10;i++{
        if i>3{
            break
        }
        fmt.Println(i)
    }
}

// 0 1 2 3

代码里只会打印到3,当大于3时会跳出整个for循环,注意整个for循环指的是直接包含break的那层for循环,举个例子:

func main() {
    for i:=0;i<10;i++{
        for j:=0;j<10;j++ {
            if j == 5 {
                break
            }
            fmt.Printf("%v-%v\n",i, j)
        }
    }
}

查看上述代码的结果,就会发现内层循环只能打印到4,而外层循环可以到9(即走完了整个for循环)。

 

除此之外,我们还可以使用标签来退出指定循环。改造上面的双层循环代码,如下:

func main() {
    EX:
    for i:=0;i<10;i++{
        for j:=0;j<10;j++ {
            if j == 5 {
                break EX
            }
            fmt.Printf("%v-%v\n",i, j)
        }
    }
}

我在最外层for循环上面加一个 EX 标签,然后 break EX,此时的结果就是当j==5时,从最外面的for循环退出来了。为了对比,可以再试下:

func main() {
    for i:=0;i<10;i++{
        EX:
        for j:=0;j<10;j++ {
            if j == 5 {
                break EX
            }
            fmt.Printf("%v-%v\n",i, j)
        }
    }
}

其实这种写法跟不加标签是一样的效果,上面也说到了,break是退出当前包含它的循环的。

 

continue(继续下一次循环)

continue 是继续下一次的循环,与 break 的区别就是不跳出整个循环,只跳过此次循环:

func main() {
    for i:=0;i<10;i++{
        if i==5{
            continue
        }
        fmt.Println(i)
    }
}

// 跳过了5,继续后面的循环
// 0 1 2 3 4 6 7 8 9

 

continue 也支持标签写法:

func main() {
    EX:
    for i:=0;i<10;i++{
        for j:=0;j<10;j++ {
            if j == 5 {
                continue EX
            }
            fmt.Printf("%v-%v\n",i, j)
        }
    }
}

 

goto(跳转到指定标签)

goto是个好东西,它可以跳转到我们指定的标签,从而执行那部分代码,例子:

func main() {
    for i:=0;i<10;i++{
        for j:=0;j<10;j++ {
            if j == 5 {
                goto breakTag
            }
            fmt.Printf("%v-%v\n",i, j)
        }
        breakTag:
            break
    }
}

如上代码,当 j==5 时,使用goto跳转到breakTag标签处,而这个标签下执行了break(注意break位置),从而使得最外层的for循环中断,是不是很好用。但是一般不主张使用goto语句,可能是因为太灵活反而容易造成程序混乱。

posted @ 2019-09-10 11:59  黑色瓶子  阅读(785)  评论(0编辑  收藏  举报