• 技术文章 >后端开发 >Golang

    go语言中goto怎么用

    青灯夜游青灯夜游2022-11-24 20:16:31原创431

    在go语言中,goto语句用于无条件跳转,可以无条件地转移到程序中指定的行;它通过标签进行代码间的无条件跳转。goto后接一个标签,这个标签的意义是告诉Go程序下一步要执行哪行的代码,语法“goto 标签;... ...标签: 表达式;”。goto打破原有代码执行顺序,直接跳转到指定行执行代码;goto语句通常与条件语句配合使用,可用来实现条件转移、构成循环、跳出循环体等功能。

    php入门到就业线上直播课:进入学习

    本教程操作环境:windows7系统、GO 1.18版本、Dell G3电脑。

    go语言中的goto语句

    goto 顾言思义,是跳转的意思。

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

    goto语句的语法

    goto 后接一个标签,这个标签的意义是告诉 Go程序下一步要执行哪行的代码。

    所以这个标签如何放置,放置在哪里,是 goto 里最需要注意的。

    goto 标签;
    ...
    ...
    标签: 表达式;

    goto 语句流程图如下:

    1.png

    goto语句的使用

    import "fmt"
    
    func main() {
    
        goto flag
        fmt.Println("B")
    flag:
        fmt.Println("A")
    
    }

    执行结果,并不会输出 B ,而只会输出 A

    A

    这边举一个例子,用 goto 的方式来实现一个打印 1到5 的循环。

    import "fmt"
    
    func main() {
        i := 1
    flag:
        if i <= 5 {
            fmt.Println(i)
            i++
            goto flag
        }
    }

    输出如下

    2.png

    再举个例子,使用 goto 实现 类型 break 的效果。

    import "fmt"
    
    func main() {
        i := 1
        for {
            if i > 5 {
                goto flag
            }
            fmt.Println(i)
            i++
        }
    flag:
    }

    输出如下

    3.png

    最后再举个例子,使用 goto 实现 类型 continue的效果,打印 1到10 的所有偶数。

    import "fmt"
    
    func main() {
        i := 1
    flag:
        for i <= 10 {
            if i%2 == 1 {
                i++
                goto flag
            }
            fmt.Println(i)
            i++
        }
    }

    输出如下

    4.png

    使用 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")
    }

    代码说明如下:

    将上面的代码使用Go语言的 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 语句后,无须额外的变量就可以快速退出所有的循环。

    使用 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()

    代码说明如下:

    注意事项

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

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

    编译错误

    .\main.go:7:7: goto flag jumps over declaration of say at .\main.go:8:6

    【相关推荐:Go视频教程

    以上就是go语言中goto怎么用的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:goto go语言
    上一篇:golang有指针么 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • Python Django的模型建立与操作(实例详解)• 一文详解golang如何实现ssh相关操作• 详解Golang中的Struct(结构体)• 聊聊Golang自带的HttpClient超时机制• php7.0怎么安装mongo扩展• 一文浅析Golang中的闭包
    1/1

    PHP中文网