我想在Go中编写一个函数,将文档插入MongoDB数据库的集合中。命名函数的方法更好,
writeToMongoDB
或WriteToMongoD
? 第二个是CamelCase,虽然我看到有人使用第一个的风格,所以我不确定哪一个更合适。感谢。
答案 0 :(得分:76)
在Go中,这不是风格问题,而是语法问题。
导出的名称(即可以从定义它们的包以外使用的标识符)以大写字母开头。因此,如果您的方法是公共API的一部分,则应该写成:
WriteToDB
但是如果它是一个内部帮助方法,则应该写成:
writeToDB
使用关键字定义导出性(extern
,public
等)这样做的好处是,将其作为名称的一部分可确保在使用标识符的任何地方都可以告诉它是否被导出而不必找到它的定义位置(查看定义是否包含关键字)。
另请参阅: Exported Identifiers来自规范。
因为Go是UTF-8编码的并且支持带有标识符名称中的字母或数字属性的任何Unicode字符,所以区域设置中没有案例概念的人可能在创建导出方法时遇到问题(默认情况下是非导出的) )。在这种情况下(双关语),通常在标识符前加X
来表示导出性。例如:X日本語
另请参阅: What's up with Unicode identifiers?来自常见问题解答。
就一般风格而言,总是使用驼峰式(除了第一个字母,如前所述)。这包括常量,函数和其他标识符。例如,(导出的)常量列表可能如下所示:
const (
StateConnected = iota
StateError
StateDone
internalStateMask = 0x2
)
此外,缩写始终使用相同的大小写,因此您可以编写以下内容之一:
dbWrite
writeDB
而不是writeDb
或DbWrite
。
答案 1 :(得分:17)
在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
答案 2 :(得分:12)
姓名
Go中的名称与任何其他语言一样重要。他们甚至有 语义效果:包外的名称的可见性 由第一个字符是否为大写字母决定。它的 因此值得花一点时间谈论命名 Go计划中的惯例。
包名称
导入包时,包名称将成为其访问者 内容。之后
导入“bytes”导入包可以讨论bytes.Buffer。它的 如果使用该软件包的每个人都可以使用相同的名称来提 其内容,这意味着包名称应该是好的: 简洁,简洁,令人回味。 按照惯例,包裹较低 案例,单字名称;不需要下划线或 mixedCaps 即可。 Err在简洁方面,因为每个人都使用你的 包将输入该名称。并且不要担心碰撞a 先验。包名称只是导入的默认名称;它需要 并非在所有源代码中都是唯一的,并且在极少数的情况下 碰撞导入包可以选择使用不同的名称 本地。无论如何,混淆是罕见的,因为文件名在 import确定正在使用哪个包。
另一个约定是包名是其基本名称 源目录; src / encoding / base64中的包导入为 “encoding / base64”但名称为base64,而不是encoding_base64 encodingBase64。
包的导入者将使用该名称来引用其内容, 所以包中的导出名称可以使用这个事实来避免口吃。 (不要使用import。表示法,它可以简化必须的测试 在他们正在测试的包之外运行,否则应该 避免。)例如,bufio包中的缓冲读取器类型 被称为Reader,而不是BufReader,因为用户将其视为bufio.Reader, 这是一个清晰,简洁的名称。而且,因为进口实体 总是用他们的包名称来解决,bufio.Reader没有 与io.Reader发生冲突。同样,创建新实例的函数 ring.Ring-这是Go-will中构造函数的定义 通常称为NewRing,但由于Ring是唯一导出的类型 通过包,并且因为包被称为ring,所以它被称为just 新的,包的客户端看起来像ring.New。使用包 结构,以帮助您选择好名字。
另一个简短的例子是一次。 once.Do(设置)读得很好,会 写一次不得改进.DoOrWaitUntilDone(设置)。长名 不要自动使事情更具可读性。 有用的文档评论 通常比超长的名字更有价值。
吸气剂
Go不为getter和setter提供自动支持。有 自己提供吸气剂和制定者并没有错,而且确实如此 通常适合这样做,但它既不是惯用的,也不是必需的 将Get放入getter的名字。如果您有一个名为owner的字段 (小写,未导出), getter方法应该称为Owner (大写,导出),而不是GetOwner 。使用大写名称 export提供了用于区分字段和方法的钩子。 :一种 如果需要,setter函数可能会被称为SetOwner 。两个名字 在实践中读得很好:
owner := obj.Owner()
if owner != user {
obj.SetOwner(user)
}
接口名称
按照惯例,单方法接口由方法名称加号命名 用于构造代理名词的-er后缀或类似修改: Reader,Writer,Formatter,CloseNotifier等。
有许多这样的名字,并且很荣幸能够尊重他们 他们捕获的函数名称。 读取,写入,关闭,刷新,字符串和 所以有规范的签名和含义。为避免混淆, 不要给你的方法一个名字,除非它有相同的名称 签名和含义。相反,如果你的类型实现了一个方法 与一个众所周知的类型的方法具有相同的含义,给它 同名和签名; 调用你的字符串转换器方法字符串不 的ToString 强>
MixedCaps
最后,Go中的约定是使用MixedCaps或者mixedCaps 比下划线写多字名称。
参考:Effective Go
答案 3 :(得分:4)
在Golang中,任何标识符以大写字母开头的变量(或函数)(例如,CamelCase)都会公开(可访问)程序中的所有其他包,而那些以小写字母开头的包除了声明它之外的任何包都不能访问字母(例如,camelCase)。
如果您打算在另一个包中使用变量(或函数),您应该使用CamelCase,或者您可以放心地使用camelCase。