Effective Go: 命名 (二)

267 阅读2分钟

这是我参与11月更文挑战的第15天,活动详情查看:2021最后一次更文挑战

Getter(获取方法)

Go语言不支持自动生成Getter和Setter方法。当然了,开发者自己编写提供Getters和Setters方法是不会有任何问题,而且这通常是合适的。但是这其实既不常见的,也不是必须要求的。看一下下面的例子,如果您有一个名为owner的字段(是小写的,私有的unexported),那么getter方法应该写成是.Owner()(是大写,公用的exported),而不是写成GetOwner。我们使用大写名称的方法来提供“钩子”,以此可以区分该方法和此字段。如果需要set方法,可以写成SetOwner。两个命名在实践中都表现很好:

owner := obj.Owner()
if owner != user {
    obj.SetOwner(user)
}

接口名称

按照惯例,一个方法的接口名称命名通常是,在一个方法的名称上加一个后缀er,用这一规则类似的修改来构建比如:Reader,Writer,Formatter,CloseNotifier等等包。

有许多这样的名称,目的是为了体现出这个接口含有的函数名称。Read,Write,Close,Flush,String等具有规范签名和含义。为避免混淆,不要向您的方法提供其中一个名称,除非它具有相同的签名和意义。相反,如果您的类型实现了具有众所周知类型上的方法,则给出相同的名称和签名,例如你有一个string转换的方法,应该命名为String,而不是ToString。

混合大写

最后,Go的规则是使用混合大写(驼峰)而不是下划线来命名。需要遵循以下规则:

  • 如果变量为私有,且特有名词为首个单词,则使用小写,如 apiClient
  • 其它情况都应当使用该名词原有的写法,如 APIClientrepoIDUserID

测试文件

文件名_test.go或者 文件名_平台_test.go。 例: path_test.go, path_windows_test.go