网站地图    收藏    合作   
<

快捷菜单 返回顶部

goto 语句通过标签进行代码间的无条件跳转。goto 语句可以在快速跳出循环、避免重复退出上有一定的帮助。Go语言中使用 goto 语句能简化一些代码的实现过程。

使用 goto 退出多层循环

下面这段代码在满足条件时,需要连续退出两层循环,使用传统的编码方式如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package main
 
import "fmt"
 
func main() {
 
    var breakAgain bool
 
    // 外循环
    for x := 0; x < 10; x++ {
 
        // 内循环
        for y := 0; y < 10; y++ {
 
            // 满足某个条件时, 退出循环
            if y == 2 {
 
                // 设置退出标记
                breakAgain = true
 
                // 退出本次循环
                break
            }
 
        }
 
        // 根据标记, 还需要退出一次循环
        if breakAgain {
                break
        }
 
    }
 
    fmt.Println("done")
}
代码说明如下:

使用 goto 集中处理错误

将上面的代码使用 Go语言的 goto 语句进行优化。

goto 跳出循环:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package main
 
import "fmt"
 
func main() {
 
    for x := 0; x < 10; x++ {
 
        for y := 0; y < 10; y++ {
 
            if y == 2 {
                // 跳转到标签
                goto breakHere
            }
 
        }
    }
 
    // 手动返回, 避免执行进入标签
    return
 
    // 标签
breakHere:
    fmt.Println("done")
}
代码说明如下:
使用 goto 语句后,无须额外的变量就可以快速退出所有的循环。

统一错误处理

多处错误处理存在代码重复时是非常棘手的,例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
err := firstCheckError()
if err != nil {
    fmt.Println(err)
    exitProcess()
    return
}
 
err = secondCheckError()
 
if err != nil {
    fmt.Println(err)
    exitProcess()
    return
}
 
fmt.Println("done")
代码说明如下:
在上面代码中,加粗部分都是重复的错误处理代码。后期陆续在这些代码中如果添加更多的判断,就需要在每一块雷同代码中依次修改,极易造成疏忽和错误。

如果使用 goto 语句来实现同样的逻辑:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    err := firstCheckError()
    if err != nil {
        goto onExit
    }
 
    err = secondCheckError()
 
    if err != nil {
        goto onExit
    }
 
    fmt.Println("done")
 
    return
 
onExit:
    fmt.Println(err)
    exitProcess()
代码说明如下:

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com