- 2.3. 不要用变量类型命名你的变量
2.3. 不要用变量类型命名你的变量
你不应该用变量的类型来命名你的变量, 就像您不会将宠物命名为“狗”和“猫”。 出于同样的原因,您也不应在变量名字中包含类型的名字。
变量的名称应描述其内容,而不是内容的类型。 例如:
var usersMap map[string]*User
这个声明有什么好处? 我们可以看到它是一个 map,它与 *User 类型有关。 但是 usersMap 是一个 map,而 Go 语言是一种静态类型的语言,如果没有定义变量,不会让我们意外地使用到它,因此 Map 后缀是多余的。
接下来, 如果我们像这样来声明其他变量:
var (companiesMap map[string]*CompanyproductsMap 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)
