这是我参与11月更文挑战的第15天,活动详情查看:2021最后一次更文挑战
今天下班比较晚,先写一部分内容
名称在 Go 中与在任何其他语言中一样重要。它们甚至具有语义效果:包外名称的可见性取决于其第一个字符是否为大写。因此,值得花一点时间讨论 Go 程序中的命名约定。
包名
导入包时,包名称成为访问这个内容的入口
import "bytes"
我们来以bytes.Buffer这个包 为例。如果每个使用包的人都可以使用相同的名称来引用其内容,这会很nice,这意味着包名称应该是好的:简短、简洁、令人回味。按照惯例,包使用小写的单字名称;应该不需要下划线或混合大写字母。简而言之,因为使用您的包的每个人都会输入该名称。并且不需要心里担心”碰撞“。包名只是导入的默认名称;它不需要在所有源代码中都是唯一的,并且在极少数发生冲突的情况下,导入包可以选择不同的名称以在本地使用。在任何情况下,混淆都很少见,因为导入中的文件名决定了正在使用哪个包。
另一个约定是包名是其源目录的基本名称; src/encoding/base64 中的包作为“encoding/base64”导入,但名称为 base64,而不是 encoding_base64 和 encodingBase64。
包的导入器将使用名称来引用其内容,因此包中的导出名称可以避免重复。 (不要使用import. 这种写法,当在他们测试的包之外运行的测试的时候可以简化,否则应该避免。)例如,bufio 包中的缓冲读取器类型称为 Reader,而不是 BufReader,因为用户将其视为 bufio.Reader,这是一个清晰简洁的名称。此外,因为导入的实体总是以其包名寻址,所以 bufio.Reader 不会与 io.Reader 冲突。类似地,创建 ring.Ring 新实例的函数——这是 Go 中构造函数的定义——通常被称为 NewRing,但由于 Ring 是包导出的唯一类型,并且由于包被称为 ring,因此仅称为 New,包的客户端将其视为 ring.New。使用包结构来帮助您选择好名字。
另一个简短的例子是 once.Do; once.Do(setup) 读起来很好,不会通过写 once.DoOrWaitUntilDone(setup) 来改进。长名称不会使内容更具可读性。有用的文档注释通常比超长的名称更有价值。