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

问题描述

Go specEffective Go提供了命名包,类型,函数和变量的准则。还有blog post讨论了程序包名称。但是似乎没有一篇文章讨论与gotobreakcontinue一起使用的标签的命名约定。

我相信最佳实践是完全避免使用标签,但是Go中这些控制流标签的标准约定是什么?

请注意,此问题并非要求提供命名建议。我只是想知道Google提供了哪些指南或他们如何实际使用它会很好。

解决方法

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

因此,只要您不使用下划线写任何东西,标签就可以具有大写或小写字符的任意组合。

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

混合帽

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

一些例子:

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 language spec的所有示例代码片段均在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--
}