Golang结构体字段命名规范是什么?

23

我正在尝试使用 Visual Studio Code 学习 Go,我想它在使用 Go linter。我创建了这个结构体来将 JSON 对象映射到其中。

type someAPI struct {
    ApiEndpoint string   `json:"apiEndpoint"`
    ApiVersion  string   `json:"apiVersion"`
    ...
}

我收到了这些警告...

结构体字段ApiEndpoint应该是APIEndpoint

结构体字段ApiVersion应该是APIVersion

我进行了一些谷歌搜索,但并没有找到关于结构体字段名称的任何要求。我找到的最多的就是,如果您想将字段公开,则必须将其大写。

那么为什么linter警告我这些名称呢?

我做了一些测试,将Api更改为Abc后,linter没有警告我将其更改为“ABC”。所以我不得不认为它正在检查以“Api”开头的名称。

Go语言中的字段命名规范是什么?或者换句话说,我还需要了解其他规范吗?

2个回答

41
在大多数情况下,Go语言中的命名约定是使用驼峰式命名,并且如果是公共字段,则首字母大写,否则使用小写。但在缩写词如API或URL等单词中,它们应该全部大写,例如在http包中的func ProxyURL(fixedURL *url.URL)
编辑:我再搜索了一下,在Go Code Review Comments中有关于缩写词的指导方针。它在Initialisms部分讨论了缩写词:
引用:

名称中的首字母缩略词或缩写词(例如“URL”或“NATO”)应具有一致的大小写格式。例如,“URL”应出现为“URL”或“url”(如“urlPony”或“URLPony”),永远不应出现为“Url”。例如:ServeHTTP而不是ServeHttp。对于具有多个初始化“单词”的标识符,请使用例如“xmlHTTPRequest”或“XMLHTTPRequest”。

当“ID”缩写表示“标识符”时,此规则也适用,因此请使用“appID”而不是“appId”。

因此,缩写词的规则是它们应该具有恒定的大小写格式。在您的情况下,因为它们必须以大写字母“A”开头,所以应该将它们写成“API”。

这只是我的个人观点,我知道示例中的代码可能不是您正在使用的确切代码,但如果是,请不要在字段名称中包含结构体名称,我认为这是一种不好的实践。您正在使用api.APIField,但api.Field更容易阅读,如果您知道对象是一个API,则没有疑问此字段属于API。


那么有一个大写强制缩写词列表吗?您是否知道任何建议使用大写缩写的文档?我想知道这是否只是因为VSC正在使用的linter而看到的,还是像fmt这样的工具也会警告我? - Jerinaw
1
我不知道有任何文档建议以那种方式进行。在 On the go 博客中,他们写了关于使用驼峰命名法的内容,但没有提到缩略词。而且 gofmt https://golang.org/cmd/gofmt/ 不强制执行缩略词的命名约定,所以我猜这只是他们在 VSC 中实现的方式,但这是标准库的编写方式,所以如果你想遵循一个标准,那么这可能是你应该使用的标准。 - Topo
1
@Jerinaw,我找到了缩写命名的文档。请看我的更新答案。 - Topo
@Jerinaw,你的IDE可能正在使用golint,它定义了“已知首字母缩略词”列表(https://github.com/golang/lint/blob/master/lint.go#L749),如果它们不是常量大小写,它就会抱怨。 - Kaedys
如果我有多个缩写的级联,该怎么办?在Java中,这就是为什么我使用像HttpHttpsSwitcher这样的名称,但根据这个指南,它将是HTTPHTTPSSwitcher(或httphttpsSwitcher以减少可见性),这很难读。下划线呢? - NotX
显示剩余2条评论

4

像你在问题中和 @topo 的回答中提到的那样,变量和函数命名的惯例是驼峰式(大小写混合)。如果名称以大写字母开头,变量/函数可以导出。

包名始终为小写字母。

接口应以 -er 结尾。

您可以在 effective go naming session 中阅读更多内容。

而 Golint 则超出了 Go 命名的惯例。有一些关于单词的规则,在您的情况下,您正在遵循其中一个规则。您可以在这里查看完整列表:https://github.com/golang/lint/blob/master/lint.go#L751


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接