golang label breaks

我们在for多层嵌套时,有时候需要直接跳出所有嵌套循环, 这时候就可以用到go的label breaks特征了。

先看一个范例代码:

package main

import (
    "fmt"
)

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

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

    fmt.Println("3")
}

执行效果:

注意,

  • label要写在for循环的开始而不是结束的地方。和goto是不一样的。虽然它是直接break退出到指定的位置。

break的标签和goto的标签的区别可以参考下面代码:

JLoop:
    for i := 0; i < 10; i++ {
        fmt.Println("label i is ", i)
        for j := 0; j < 10; j++ {
            if j > 5 {
                //跳到外面去啦,但是不会再进来这个for循环了
                break JLoop
            }
        }
    }

    //跳转语句 goto语句可以跳转到本函数内的某个标签
    gotoCount := 0
GotoLabel:
    gotoCount++
    if gotoCount < 10 {
        goto GotoLabel //如果小于10的话就跳转到GotoLabel
    }

 

break 标签除了可以跳出 for 循环,还可以跳出 select switch 循环, 参考下面代码:

L:
    for ; count < 8192; count++ {
        select {
        case e := <-self.pIdCh:
            args[count] = e

        default:
            break L // 跳出 select 和 for 循环
        }

    }

 

 

参考:

译:go’s block and identifiers scope
http://studygolang.com/articles/1438

时间: 2024-11-06 22:14:09

golang label breaks的相关文章

Golang1.13.x 解决go get 无法下载问题

安装golang github.com/hyperledger/fabric-contract-api-go依赖包的时候,长时间无响应,最后报如下错误: go: github.com/hyperledger/[email protected]: Get https://proxy.golang.org/github.com/hyperledger/fabric-contract-api-go/@v/v1.0.0.mod: dial tcp 172.217.27.145:443: i/o time

fabric2.0链码操作

1.打包链码链码在安装前需要打包为tar文件.我们可以使用peer命令,node sdk,或者第三方工具.第三方的打包工具需要满足以下要求:   链码以tar.gz结尾:   tar文件需要包含2个文件(不是目录),元文件Chaincode-Package-Metadata.json和chaincode文件.   Chaincode-Package-Metadata.json文件长成下面这样.   {"Path":"fabric-samples/chaincode/fabca

golang break label 与goto label

本文链接:https://blog.csdn.net/itbsl/article/details/73380537 与其他语言一样,Go语言也支持label(标签)语法:分别是break label和 goto label 这样使得编程时变得异常灵活,但是由于在大项目中不好控制,所以建议能不使用goto label就不要使用 break label 和 goto label都能在循环中跳出循环,但是又有些不同之处. 首先说下break label,break的跳转标签(label)必须放在循环语

Golang基础学习总结

1.不支持继承 重载 ,比如C++Java的接口,接口的修改会影响整个实现改接口的类行为的修改,Go 设计者认为这一特点或许根本没用. 2.必任何函数定义必须花括号跟在函数声明后面而不能换行 如 func  funca(a int){},在Go语言中 函数也是一种类型 可以被推导  使用支持匿名函数 和闭包. 函数的返回值支持多重返回类似Python , 如果不赋值  整数类型默认 0     浮点数类型默认0.0   error类型 默认是nil 3.不用的包一定不要引入,这是Go的原则,就如

[转]50 Shades of Go: Traps, Gotchas, and Common Mistakes for New Golang Devs

http://devs.cloudimmunity.com/gotchas-and-common-mistakes-in-go-golang/ 50 Shades of Go: Traps, Gotchas, and Common Mistakes for New Golang Devs Go is a simple and fun language, but, like any other language, it has a few gotchas... Many of those gotc

使用 Elastic Stack 来监控和调优 Golang 应用程序

Golang 因为其语法简单,上手快且方便部署正被越来越多的开发者所青睐,一个 Golang 程序开发好了之后,势必要关心其运行情况,今天在这里就给大家介绍一下如果使用 Elastic Stack 来分析 Golang 程序的内存使用情况,方便对 Golang 程序做长期监控进而调优和诊断,甚至发现一些潜在的内存泄露等问题. Elastic Stack 其实是一个集合,包含 Elasticsearch.Logstash 和 Beats 这几个开源软件,而 Beats 又包含 Filebeat.P

在 Golang 中使用 Protobuf

安装 goprotobuf 1.从 https://github.com/google/protobuf/releases 获取 Protobuf 编译器 protoc(可下载到 Windows 下的二进制版本 wget https://github.com/google/protobuf/releases/download/v2.6.1/protobuf-2.6.1.tar.gz tar zxvf protobuf-2.6.1.tar.gz cd protobuf-2.6.1 ./config

Golang 知识点总结

Golang 知识点总结 目录 [?] 各种类型复制的时候的花费 可使用内建函数的类型 (len.cap.close.delete.make) 内建容器类型的值比较 组合类型T{...}的值比较 零值是nil的类型 编译时被执行的函数 不能被寻址的值 不支持比较的类型 可命名的源代码元素 命名的源代码元素可以使用 ()分组声明 可以在函数内外声明的源代码元素 可以返回一个可选bool返回值的表达式 使用channel机制永远阻塞当前goroutine的方法 连接字符串的几种方法 原文: Gola

利用golang和QML来开发Ubuntu应用

在前面的文章"使用golang来设计我们的Ubuntu Scope"中,我们已经介绍了如何利用golang来开发Ubuntu Scope.在今天的文章中,我们来简单介绍一下如何使用golang来开发QML应用.这对于一些熟悉golang语言的,但是不是很熟悉C++的开发这来说,无疑是一个好的选择.虽然我们大多数的QML应用只需要QML加上一些Javascript的脚本即可,但是我们可以使用Qt C++或Go语言来拓展它的功能,来做一些需要计算或特殊功能的部分. 首先,我们来查看我们中国