在Go语言中如何命名函数,CamelCase还是Semi-CamelCase?[关闭]

ni65a41a  于 2023-11-14  发布在  Go
关注(0)|答案(5)|浏览(112)

已关闭。此问题为opinion-based。目前不接受回答。
**要改进此问题吗?**更新此问题,以便editing this post可以使用事实和引文来回答。

25天前关闭
社区在25天前审查了是否重新打开这个问题,并将其关闭:
原始关闭原因未解决
Improve this question
我想用Go语言写一个函数,将一个文档插入到MongoDB数据库的集合中。函数的命名方式是什么?

  • writeToMongoDB
  • WriteToMongoD

第二个是CamelCase,虽然我看到有人使用第一个的风格,所以我不知道哪一个更合适。谢谢。

a64a0gku

a64a0gku1#

安装

在Go中,这不是风格的问题,而是语法的问题。
导出的名称(也就是说,可以从定义它们的包之外的包中使用的标识符)开始以大写字母开头。因此,如果您的方法是公共API的一部分,则应该这样写:
第一个月
但如果它是一个内部帮助器方法,它应该这样写:
writeToDB
与使用关键字定义导出性(externpublic等)相比,这样做的好处是将其作为名称的一部分,确保在使用标识符的任何地方,您都可以知道它是否被导出,而不必查找它的定义位置(查看定义是否包含关键字)。

**另请参阅:规格中的 * 导出标识符 *。

i18n

因为Go语言是UTF-8编码的,并且支持任何Unicode字符,在标识符名称中具有字母或数字属性,所以一些没有大小写概念的语言环境中的人可能会在创建导出方法时遇到麻烦(默认值为non-exported)。在这种情况下(双关语),通常会在标识符前面加上X来表示导出。例如:X日本語

参见: Unicode标识符是怎么回事? 来自FAQ。

风格

就一般的风格而言,它总是使用camel-case(除了第一个字母,如前所述)。这包括常量,函数和其他标识符。例如,(导出的)常量列表可能看起来像:

const (
    StateConnected = iota
    StateError
    StateDone

    internalStateMask = 0x2 
)

字符串
此外,缩写总是用相同的大小写书写,所以你可以写下面的一个:

dbWrite
writeDB


而不是writeDbDbWrite

fiei3ece

fiei3ece2#

在Go中,使用混合上限是惯例。来自文档:https://golang.org/doc/effective_go.html#mixed-caps
最后,Go语言中的约定是使用MixedCaps或mixedCaps而不是下划线来写多字名称。
请注意,以大写字母开头的文件级别名称将在包级别导出:https://golang.org/doc/effective_go.html#Getters
此外,按照惯例,在所有大写字母上都写上首字母缩略词。所以下面就可以了:

writeToMongoDB // unexported, only visible within the package

字符串

WriteToMongoDB // exported


而不是:

writeToMongoDb

6g8kf2rb

6g8kf2rb3#

名字
名字在Go语言中和在其他语言中一样重要。它们甚至具有语义效果:一个名字在包外的可见性取决于它的第一个字符是否大写。因此,值得花一点时间讨论Go程序中的命名约定。
包名
导入包时,包名称将成为内容的访问器。
import“bytes”导入包可以讨论bytes. Buffer。如果每个使用包的人都可以使用相同的名称来引用它的内容,这会很有帮助,这意味着包名应该是好的:简短,简洁,令人回味。按照惯例,包名是小写的,单字的;应该不需要下划线或mixedCaps。为了简洁起见,因为每个使用你的包的人都会输入这个名字。不要担心冲突。包名只是导入的默认名称;它不需要在所有源代码中都是唯一的,在极少数冲突的情况下,导入包可以选择一个不同的名称在本地使用。在任何情况下,混淆都是罕见的,因为导入中的文件名决定了哪个包正在使用。
另一个约定是包名是其源目录的基名称; src/encoding/base64中的包被导入为“encoding/base64”,但名称为base64,而不是encoding_base64和encodingBase 64。
包的导入程序将使用该名称来引用其内容,因此包中的导出名称可以使用该事实来避免卡顿。(不要使用import . notation,它可以简化必须在测试包外部运行的测试,但应该避免使用。)例如,bufio包中的缓冲读取器类型称为Reader,而不是BufReader,因为用户将其视为bufio.Reader,这是一个清晰、简洁的名称。此外,因为导入的实体总是用它们的包名bufio.Reader来寻址,所以bufio.Reader与io. Reader不冲突。类似地,创建ring. Ring的新示例的函数--这是Go中构造函数的定义--通常被称为NewRing,但是因为Ring是包导出的唯一类型,并且因为包被称为ring,所以它被称为New,包的客户端将其视为ring. New。使用包结构来帮助您选择好的名称。
另一个简短的例子是once.Do; once.Do(setup)读起来很好,写一次不会得到改善。DoOrWaitUntilDone(setup)。长名称不会自动使内容更可读。有用的文档注解通常比超长名称更有价值
Getters
Go不提供对getter和setter的自动支持。自己提供getter和setter并没有什么错,而且这样做通常是合适的,但将Get放入getter的名称中既不符合习惯,也没有必要。如果您有一个名为owner的字段,(小写,未导出),getter方法应称为Owner(大写,导出),而不是GetOwner。使用大写名称导出提供了区分字段和方法的钩子。如果需要,可以使用setter函数,可能会被称为SetOwner。这两个名称在实践中读起来都很好:

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

字符串
接口名称

按照惯例,单方法接口由方法名称加上-er后缀或类似的修改来命名,以构造代理名词:Reader,Writer,Formatter,CloseNotifier等

有很多这样的名字,荣誉它们和它们所捕获的函数名是很有成效的。**Read,Write,Close,Flush,String等都有规范的签名和含义。为了避免混淆,不要给你的方法取这些名字中的一个,除非它有相同的签名和含义。**相反,如果你的类型实现了一个方法,它的含义与一个已知类型上的方法相同,给予相同的名称和签名;调用字符串转换器方法String而不是ToString
混合帽

最后,Go语言中的约定是使用MixedCaps或mixedCaps而不是下划线来写多字名称

Ref:Effective Go

qaxu7uf2

qaxu7uf24#

在Golang中,任何标识符以大写字母(例如CamelCase)开头的变量(或函数)对程序中的所有其他包都是公共的(可访问的),而那些以小写字母(例如CamelCase)开头的变量(或函数)对任何包都不可访问,除了声明它的包。
如果你打算在另一个包中使用变量(或函数),你应该使用CamelCase,或者你可以安全地坚持使用CamelCase。

50few1ms

50few1ms5#

来自Go语言的官方文档:MixedCaps最后,Go语言中的约定是使用MixedCaps或mixedCaps而不是下划线来编写多字名称。https://go.dev/doc/effective_go#mixed-caps

相关问题