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)