为了账号安全,请及时绑定邮箱和手机立即绑定

在 Go 中命名标签的标准做法是什么?

在 Go 中命名标签的标准做法是什么?

Go
catspeake 2022-07-04 10:07:06
Go 规范和Effective Go提供了命名包、类型、函数和变量的指南。还有一篇博客文章讨论了包名称。但是似乎没有一篇文章谈论与goto,break和一起使用的标签的命名约定continue。我认为最好的做法是完全避免使用标签,但是 Go 中这些控制流标签的标准约定是什么?请注意,此问题不要求提供命名建议。我只是认为了解 Google 提供的有关它的指南或他们如何实际使用它会很好。
查看完整描述

1 回答

?
喵喔喔

TA贡献1735条经验 获得超5个赞

根据 Go 标准库和内部包的源代码,他们倾向于以与通常命名变量相同的方式命名标签。


因此,标签可以包含大写或小写字符的任意组合,只要您不使用下划线书写任何内容即可。


见https://golang.org/doc/effective_go.html#mixed-caps


混合大写

最后,Go 中的约定是使用MixedCapsormixedCaps而不是下划线来编写多字名称。


一些例子:


https://golang.org/src/cmd/internal/obj/x86/pcrelative_test.go#L102


continue LOOP

https://golang.org/src/compress/lzw/reader.go#L198


break loop

https://golang.org/src/compress/flate/deflate.go#L402


break Loop

https://golang.org/src/debug/gosym/symtab.go#L429


break countloop

https://golang.org/src/encoding/csv/reader.go#L308


break parseField

https://golang.org/src/crypto/dsa/dsa.go#L128


break GeneratePrimes

https://golang.org/src/go/types/testdata/labels.src


func f3() {

L1:

L2:

L3:

    for {

        break L1 /* ERROR "invalid break label L1" */

        break L2 /* ERROR "invalid break label L2" */

        break L3

        continue L1 /* ERROR "invalid continue label L1" */

        continue L2 /* ERROR "invalid continue label L2" */

        continue L3

        goto L1

        goto L2

        goto L3

    }

}

Go 语言规范中的所有示例片段都将所有标签写入CamelCase. 这个词在规范和实现中Loop经常被缩写。L


https://golang.org/ref/spec#Break_statements


OuterLoop:

    for i = 0; i < n; i++ {

        for j = 0; j < m; j++ {

            switch a[i][j] {

            case nil:

                state = Error

                break OuterLoop

            case item:

                state = Found

                break OuterLoop

            }

        }

    }

https://golang.org/ref/spec#Continue_statements


RowLoop:

    for y, row := range rows {

        for x, data := range row {

            if data == endOfRow {

                continue RowLoop

            }

            row[x] = data + bias(x, y)

        }

    }

https://golang.org/ref/spec#Goto_statements


goto Error

    goto L  // BAD

    v := 3

L:

if n%2 == 1 {

    goto L1

}

for n > 0 {

    f()

    n--

L1:

    f()

    n--

}


查看完整回答
反对 回复 2022-07-04
  • 1 回答
  • 0 关注
  • 98 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信