网站地图    收藏    合作   
<

快捷菜单 返回顶部

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

使用 goto 退出多层循环

下面这段代码在满足条件时,需要连续退出两层循环,使用传统的编码方式如下:
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 跳出循环:
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 语句后,无须额外的变量就可以快速退出所有的循环。

统一错误处理

多处错误处理存在代码重复时是非常棘手的,例如:
err := firstCheckError()
if err != nil {
    fmt.Println(err)
    exitProcess()
    return
}

err = secondCheckError()

if err != nil {
    fmt.Println(err)
    exitProcess()
    return
}

fmt.Println("done")
代码说明如下:
在上面代码中,加粗部分都是重复的错误处理代码。后期陆续在这些代码中如果添加更多的判断,就需要在每一块雷同代码中依次修改,极易造成疏忽和错误。

如果使用 goto 语句来实现同样的逻辑:
    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