你不应该用变量的类型来命名你的变量, 就像您不会将宠物命名为“狗”和“猫”。 出于同样的原因,您也不应在变量名字中包含类型的名字。
变量的名称应描述其内容,而不是内容的类型。 例如:
var usersMap map[string]*User
这个声明有什么好处? 我们可以看到它是一个 map
,它与 *User
类型有关。 但是 usersMap
是一个 map
,而 Go 语言是一种静态类型的语言,如果没有定义变量,不会让我们意外地使用到它,因此 Map
后缀是多余的。
接下来, 如果我们像这样来声明其他变量:
var (
companiesMap map[string]*Company
productsMap map[string]*Products
)
usersMap
,companiesMap
和 productsMap
三个 map
类型变量,所有映射字符串都是不同的类型。 我们知道它们是 map
,我们也知道我们不能使用其中一个来代替另一个 - 如果我们在需要 map[string]*User
的地方尝试使用 companiesMap
, 编译器将抛出错误异常。 在这种情况下,很明显变量中 Map
后缀并没有提高代码的清晰度,它只是增加了要输入的额外样板代码。
我的建议是避免使用任何类似变量类型的后缀。
贴士:
如果users
的描述性都不够用,那么usersMap
也不会。
此建议也适用于函数参数。 例如:
type Config struct {
//
}
func WriteConfig(w io.Writer, config *Config)
命名 *Config
参数 config
是多余的。 我们知道它是 *Config
类型,就是这样。
在这种情况下,如果变量的生命周期足够短,请考虑使用 conf
或 c
。
如果有更多的 *Config
,那么将它们称为 original
和 updated
比 conf1
和 conf2
会更具描述性,因为前者不太可能被互相误解。
贴士:
不要让包名窃取好的变量名。
导入标识符的名称包括其包名称。 例如,context
包中的Context
类型将被称为context.Context
。 这使得无法将context
用作包中的变量或类型。
func WriteLog(context context.Context, message string)
上面的栗子将会编译出错。 这就是为什么
context.Context
类型的通常的本地声明是ctx
,例如:
func WriteLog(ctx context.Context, message string)