• 2.3. 不要用变量类型命名你的变量

    2.3. 不要用变量类型命名你的变量

    你不应该用变量的类型来命名你的变量, 就像您不会将宠物命名为“狗”和“猫”。 出于同样的原因,您也不应在变量名字中包含类型的名字。

    变量的名称应描述其内容,而不是内容的类型。 例如:

    1. var usersMap map[string]*User

    这个声明有什么好处? 我们可以看到它是一个 map,它与 *User 类型有关。 但是 usersMap 是一个 map,而 Go 语言是一种静态类型的语言,如果没有定义变量,不会让我们意外地使用到它,因此 Map 后缀是多余的。

    接下来, 如果我们像这样来声明其他变量:

    1. var (
    2. companiesMap map[string]*Company
    3. productsMap map[string]*Products
    4. )

    usersMapcompaniesMapproductsMap 三个 map 类型变量,所有映射字符串都是不同的类型。 我们知道它们是 map,我们也知道我们不能使用其中一个来代替另一个 - 如果我们在需要 map[string]*User 的地方尝试使用 companiesMap, 编译器将抛出错误异常。 在这种情况下,很明显变量中 Map 后缀并没有提高代码的清晰度,它只是增加了要输入的额外样板代码。

    我的建议是避免使用任何类似变量类型的后缀。

    贴士:如果 users 的描述性都不够用,那么 usersMap 也不会。

    此建议也适用于函数参数。 例如:

    1. type Config struct {
    2. //
    3. }
    4. func WriteConfig(w io.Writer, config *Config)

    命名 *Config 参数 config 是多余的。 我们知道它是 *Config 类型,就是这样。

    在这种情况下,如果变量的生命周期足够短,请考虑使用 confc

    如果有更多的 *Config,那么将它们称为 originalupdatedconf1conf2 会更具描述性,因为前者不太可能被互相误解。

    贴士:不要让包名窃取好的变量名。导入标识符的名称包括其包名称。 例如,context 包中的 Context 类型将被称为 context.Context。 这使得无法将 context 用作包中的变量或类型。

    1. func WriteLog(context context.Context, message string)

    上面的栗子将会编译出错。 这就是为什么 context.Context 类型的通常的本地声明是 ctx,例如:

    1. func WriteLog(ctx context.Context, message string)