老男孩IT教育,只培养技术精英

全国免费咨询电话:400-609-2893
Go语言循环控制语句

    /    2018-12-03

循环控制语句可以控制循环体内语句的执行过程。

GO 语言支持 goto、break、continue 三种循环控制语句,三个语句都可以配合标签( label )使用,标签名区分大小写,定义后不使用会造成编译错误。

goto 语句

Go语言支持在函数内 goto 跳转。goto 语句可以无条件地转移到过程中指定的行,通常与条件语句配合使用。可用来实现条件转移、构成循环、跳出循环体等功能。实例如下:

1、先定义标签后定义goto语句

package main

import "fmt"

func main() {
    var i int = 10

GO:
    for i < 20 {
        if i == 15 { //跳过迭代
            i = i + 1
            goto GO
        }
        fmt.Printf("i的值为 : %d\n", i)
        i++
    }
}

2、先定义goto语句后定义标签

package main

import "fmt"

func main() {
    var i int
    for {
        fmt.Println(i)
        i++
        if i > 2 {
            goto oldboy
        }
    }
oldboy:
    fmt.Println("golang")
}

注意:goto语句与标签之间不能有变量声明,否则编译错误。

package main

import "fmt"

func main() {
    fmt.Println("start")
    goto Loop
    var say = "hello oldboy"
    fmt.Println(say)
Loop:
    fmt.Println("end")
}

编译错误:

./main.go:7:7: goto Loop jumps over declaration of say at ./main.go:8:6

break 语句

1、break 语句中断当前 for 循环,并开始执行循环之后的语句

package main

import "fmt"

func main() {
    var i int = 10

    for i < 20 {
        fmt.Printf("i 的值为 : %d\n", i)
        i++
        if i > 15 {
            // break 语句跳出循环
            break
        }
    }
}

2、break 语句中断当前 for range 循环,并开始执行循环之后的语句

package main

import (
    "fmt"
)

func main() {
    m := map[int]string{
        1: "oldboy",
        2: "Linux",
        3: "Python",
        4: "Java",
        5: "Golang",
    }

    for k, v := range m {
        fmt.Printf("%d => %s \n", k, v)
        if v == "Golang" {
            // break 语句跳出循环
            break
        }
    }
}

3、break 语句在执行一条 case 后跳出 switch 循环

package main

import (
    "fmt"
)

func main() {

    name := "Golang"
    switch name {
    case "oldboy":
        fmt.Println(name)
        break
    case "Linux":
        fmt.Println(name)
        break
    case "Golang":
        fmt.Println(name)
        break
    case "Python":
        fmt.Println(name)
        break
    case "Java":
        fmt.Println(name)
        break
    case "DBA":
        fmt.Println(name)
        break
    }
}

4、break 语句在执行一条 case 后跳出 select 循环

package main

import "fmt"

func main() {
    var ch chan int
    ch = make(chan int, 1)
    // ch <- 1
    select {
    case i := <-ch:
        fmt.Printf("received %d %s", i, " from ch\n")
        break
    default:
        fmt.Println("break")
        break
    }
}

5、Break label 语句 跳出多层嵌套循环

package main

import (
    "fmt"
)

func main() {
    fmt.Println("start")

Exit:
    for i := 0; i < 9; i++ {
        for j := 0; j < 9; j++ {
            if i+j > 15 {
                fmt.Println("exit")
                break Exit
            }
        }
    }

    fmt.Println("end")
}

break 标签除了可以跳出 for 循环,还可以跳出 select、switch 循环。

注意:label要写在循环的开始而不是结束的地方,和goto语句不一样。

package main

import (
    "fmt"
)

func main() {
    fmt.Println("start")

    for i := 0; i < 9; i++ {
        for j := 0; j < 9; j++ {
            if i+j > 15 {
                fmt.Println("exit")
                break Exit
            }
        }
    }
Exit:
    fmt.Println("end")
}

编译错误:

./main.go:14:11: break label not defined: Exit
./main.go:18:1: label Exit defined and not used

continue 语句

1、continue 语句在 for 循环和for range 循环中用于跳过当前循环的剩余语句,然后继续进行下一轮循环。

package main

import "fmt"

func main() {
    // for 循环
    for i := 0; i < 5; i++ {
        if i == 2 {
            continue
        }
        fmt.Printf("i 的值为 : %d\n", i)
    }
    // for range 循环
    sli := []string{"Linux", "Python", "Golang", "Java"}
    for _, v := range sli {
        fmt.Println(v)
        if v != "Golang" {
            continue
        }
        fmt.Println("The old boy welcomes you.")
    }
}

2、continue label 语句可在多级嵌套循环中跳出

package main

import "fmt"

func main() {

BreakLabel:
    for i := 0; i < 3; i++ {
    ContinueLabel:
        for j := 0; j < 5; j++ {
            if j > 2 {
                continue ContinueLabel
            }
            if i > 1 {
                break BreakLabel
            }

            fmt.Print(i, ":", j, " ")
        }
        fmt.Println()
    }
}

(0)

分享至