何时在Go中的变量名中使用前导下划线

何时在Go中的变量名中使用前导下划线,go,naming-conventions,Go,Naming Conventions,在变量名中引入有什么特殊用途吗 例如: func(_m*MockTracker). 从 在命名转换中,似乎没有关于变量名中的u的内容。 从此处开始:在以下列表中,标识符名称中的前导下划线没有定义特殊含义: 标识符 标识符命名程序实体,如变量和类型。一 标识符是一个或多个字母和数字的序列。第一 标识符中的字符必须是字母 identifier=字母{letter | unicode_digit}。 a _x9 ThisVariableIsExported αβ 您的示例是从代码生成的 在您链接

在变量名中引入
有什么特殊用途吗

例如:
func(_m*MockTracker).


在命名转换中,似乎没有关于变量名中的u的内容。
从此处开始:

在以下列表中,标识符名称中的前导下划线没有定义特殊含义:

标识符

标识符命名程序实体,如变量和类型。一 标识符是一个或多个字母和数字的序列。第一 标识符中的字符必须是字母

identifier=字母{letter | unicode_digit}。

a
_x9 
ThisVariableIsExported 
αβ
您的示例是从代码生成的

在您链接的包中,您将看到以下内容:

// Recorder for MockTracker (not exported)
type _MockTrackerRecorder struct {
    mock *MockTracker
}
mockgen包中的sanitize函数在包名称前加了一个下划线,似乎是为了保持一致性,并确保标识符名称保持私有(即不导出,因为它们以大写字母开头)。但它不是Go规范中定义的东西

// sanitize cleans up a string to make a suitable package name.
func sanitize(s string) string {
    t := ""
    for _, r := range s {
        if t == "" {
            if unicode.IsLetter(r) || r == '_' {
                t += string(r)
                continue
            }
        } else {
            if unicode.IsLetter(r) || unicode.IsDigit(r) || r == '_' {
                t += string(r)
                continue
            }
        }
        t += "_"
    }
    if t == "_" {
        t = "x"
    }
    return t
}

没有特别的意义,但不要自己做。这不是惯用语。