【问题标题】:What are Golang Struct Field Naming Conventions?什么是 Golang 结构字段命名约定?
【发布时间】:2018-09-16 20:47:24
【问题描述】:

我正在尝试使用 Visual Studio Code 学习 Go,我猜它使用的是 Go linter。我创建了这个结构来映射一个 JSON 对象。

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

我收到这些警告...

struct field ApiEndpoint 应该是 APIEndpoint

结构字段 Api​​Version 应该是 APIVersion

我做了一些谷歌搜索,但我找不到与此相关的结构字段名称的任何要求。我发现最多的是,如果你想公开一个字段,你必须大写它。

那么为什么这个 linter 会警告我这些名字呢?

我通过将 Api 更改为 Abc 进行了一些测试,并且 linter 没有警告我将其更改为“ABC”。所以我必须假设它正在检查以“Api”开头的名称。

字段名称的 Go 约定是什么?或者换句话说,还有其他我应该知道的约定吗?

【问题讨论】:

    标签: go


    【解决方案1】:

    在大多数情况下,Go 中的命名约定只是使用驼峰式大小写,如果是公共字段,则以大写开头,如果不是,则以小写开头。但在 API 或 URL 等首字母缩略词中,它们以全大写形式书写,例如。 func ProxyURL(fixedURL *url.URL)http package 上。

    编辑:我搜索了更多内容,Go Code Review Comments 上有首字母缩略词指南。它在Initialisms 部分讨论了首字母缩略词:

    名称中的单词是首字母缩写词或首字母缩略词(例如“URL”或“NATO”) 有一个一致的案例。例如,“URL”应显示为“URL”或 “url”(如“urlPony”或“URLPony”),绝不是“Url”。举个例子: ServeHTTP 不是 ServeHttp。对于具有多个初始化的标识符 “单词”,例如使用“xmlHTTPRequest”或“XMLHTTPRequest”。

    这个规则也适用于“ID”,它是“identifier”的缩写,所以 写“appID”而不是“appId”。

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

    这只是我个人的看法,我知道示例中的代码可能不是您使用的确切代码,但如果是,我认为在字段名称中包含结构名称是一种不好的做法。你正在做api.APIFieldapi.Field 更容易阅读,如果你知道该对象是一个 API,那么毫无疑问该字段属于一个 API。

    【讨论】:

    • 那么有一个强制大写的首字母缩略词列表吗?您是否知道任何建议使用大写字母作为首字母缩略词的文档?我想我想知道这是否只是因为 Linter VSC 正在使用而我看到的东西,还是类似 fmt 的东西也会警告我?
    • 我不知道有任何文档建议这样做。在 go 博客上,他们写了关于使用驼峰式大小写的文章,但没有说明首字母缩略词。 gofmt golang.org/cmd/gofmt 不强制执行首字母缩写词的命名约定,所以我猜这只是他们在 VSC 中实现它的方式,但这是标准库的编写方式,所以如果你想坚持一个标准可能是您应该使用的。
    • @Jerinaw 我找到了缩写词命名的文档。请参阅我的更新答案。
    • @Jerinaw 您的 IDE 可能正在使用 golint,它定义了 this list 的“已知初始值”,如果它们不是常量大小写,它会抱怨。
    • 如果我有多个首字母缩写词级联怎么办?这就是我在 Java 中使用 HttpHttpsSwitcher 之类的名称的原因,但根据本指南,它将是 HTTPHTTPSSwitcher(或 httphttpsSwitcher 以降低可见性),这读起来很痛苦。下划线?
    【解决方案2】:

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

    包总是小写的。

    接口应该以-er结尾

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

    另一方面,Golint 超越了 Go 的命名约定。单词有一些规则,在您的情况下,您正在满足其中一个规则。您可以在此处查看完整列表:https://github.com/golang/lint/blob/master/lint.go#L751

    【讨论】:

      猜你喜欢
      • 2011-03-05
      • 1970-01-01
      • 2014-02-10
      • 2011-08-20
      • 2012-11-09
      • 2011-10-06
      • 2022-06-28
      • 2016-12-15
      • 1970-01-01
      相关资源
      最近更新 更多