何时在Go

时间:2015-04-27 09:20:46

标签: go naming-conventions

在变量名称中引导_有什么特殊目的吗?

实施例: func (_m *MockTracker)...

来自here

2 个答案:

答案 0 :(得分:2)

spec中的标识符名称中的前导下划线没有特殊含义:

  

<强>标识符

     

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

     

identifier = letter { letter | unicode_digit } .

a
_x9 
ThisVariableIsExported 
αβ

您的示例是从mockgen.go生成的代码。

在您关联的套餐中,您会看到以下内容:

// 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
}

答案 1 :(得分:1)

似乎在命名对话中的变量名中没有关于_的内容。 从这里开始:effective go