## 5.4\. 命名
名称在 Go 里和在其它语言里一样重要。某种情况下它们甚至有语义效果:例如,一个名称能否在包外可见取决于它的第一个字母是否大写。所以值得花点时间探讨下 Go 程序的命名约定:
### 5.4.1\. 包的命名
当包引入时,包名成为其内容的引导符。
`import "bytes"`
后, 导入者可以讲 bytes.Buffer。更有用的是每个包的用户都能使用相同的名称指出它的内容,亦即包应有个好名称:短,精,好记。习惯上包名是小写的单字的名称;应无必要用下划线或大小混写。简错不纠,因为你的包的每个用户都要敲这个名字。还有不要无谓烦扰撞名。包名只是引入时的默认名;它不需在所有源码中都唯一,如出现少见的撞名,导入者可以给出不同的名字局部使用。无论如何,撞名很少见,因为 import 用的文件名只决定使用那个包。
另一个习惯是包名是源目录的基名;src/pkg/container/vector 里的包引入为 “container/vector” 但包名是 vector,不是 container_vector 也不是 containerVector。
导入者使用包名引导其内容 (import . 的记法主要特意用在测试或其它不寻常的场合),所以包的导出的名称可据此避免结结巴巴。例如,bu?o 包的 buffered reader 叫 Reader,不叫 BufReader,因为用户看到的是 bu?o.Reader 这个清楚简短的名称。再有,因为导入项总是给出其包名,bu?o.Reader 不会和 io.Reader 撞名。类似的,用来生成 ring.Ring 的函数 — 即 Go 的架构函数 — 通常会被称为NewRing,但因为 Ring 是此包唯一的导出类型,并且既然包名叫ring,它就叫 New。此包的客户看到的是 ring.New。使用包结构帮你来选个好名。
Another short example is once.Do; once.Do(setup) reads well and would not be improved by writing once.DoOrWaitUntilDone(setup). Long names don't automatically make things more readable. If the name represents something intricate or subtle, it's usually better to write a helpful doc comment than to attempt to put all the information into the name.
### 5.4.2\. 接口的命名
习惯上,单一成员的界面的名称是其成员名加 -er:Reader, Writer,Formatter 等。
存在这样的一些名称,尊重它们和它们所指的函数会工作的更好。Read, Write, Close, Flush, String 等保有正统的签名和意义。为了避免混淆, 除非有同样的签名和意义,不要给你的方法这些名字。同理,如果你的方法实现了和这些著名方法同样的意图,给它同样的名称和签名;叫你的字符转换器 String 而不是 ToString。
### 5.4.3\. 大小写混写
最后,Go 习惯使用 MixedCaps 和 mixedCaps,而不是下划线来写多字的名称。
- 1. 关于本文
- 2. Go语言简介
- 3. 安装go环境
- 3.1. 简介
- 3.2. 安装C语言工具
- 3.3. 安装Mercurial
- 3.4. 获取代码
- 3.5. 安装Go
- 3.6. 编写程序
- 3.7. 进一步学习
- 3.8. 更新go到新版本
- 3.9. 社区资源
- 3.10. 环境变量
- 4. Go语言入门
- 4.1. 简介
- 4.2. Hello,世界
- 4.3. 分号(Semicolons)
- 4.4. 编译
- 4.5. Echo
- 4.6. 类型简介
- 4.7. 申请内存
- 4.8. 常量
- 4.9. I/O包
- 4.10. Rotting cats
- 4.11. Sorting
- 4.12. 打印输出
- 4.13. 生成素数
- 4.14. Multiplexing
- 5. Effective Go
- 5.1. 简介
- 5.2. 格式化
- 5.3. 注释
- 5.4. 命名
- 5.5. 分号
- 5.6. 控制流
- 5.7. 函数
- 5.8. 数据
- 5.9. 初始化
- 5.10. 方法
- 5.11. 接口和其他类型
- 5.12. 内置
- 5.13. 并发
- 5.14. 错误处理
- 5.15. Web服务器
- 6. 如何编写Go程序
- 6.1. 简介
- 6.2. 社区资源
- 6.3. 新建一个包
- 6.4. 测试
- 6.5. 一个带测试的演示包
- 7. Codelab: 编写Web程序
- 7.1. 简介
- 7.2. 开始
- 7.3. 数据结构
- 7.4. 使用http包
- 7.5. 基于http提供wiki页面
- 7.6. 编辑页面
- 7.7. template包
- 7.8. 处理不存在的页面
- 7.9. 储存页面
- 7.10. 错误处理
- 7.11. 模板缓存
- 7.12. 验证
- 7.13. 函数文本和闭包
- 7.14. 试试!
- 7.15. 其他任务
- 8. 针对C++程序员指南
- 8.1. 概念差异
- 8.2. 语法
- 8.3. 常量
- 8.4. Slices(切片)
- 8.5. 构造值对象
- 8.6. Interfaces(接口)
- 8.7. Goroutines
- 8.8. Channels(管道)
- 9. 内存模型
- 9.1. 简介
- 9.2. Happens Before
- 9.3. 同步(Synchronization)
- 9.4. 错误的同步方式
- 10. 附录
- 10.1. 命令行工具
- 10.2. 视频和讲座
- 10.3. Release History
- 10.4. Go Roadmap
- 10.5. 相关资源