Go语言命名规则决定代码可见性与导入正确性:包名须全小写单数无下划线,导出标识符首字母大写,切片类型统一用XxxSlice,文件名小写加下划线,测试文件以_test.go结尾,接收器用单字母缩写,包名与目录名应一致。

Go语言命名不是“选个顺眼的名字”,而是直接决定代码能否被正确导入、方法能否被外部调用、包是否容易冲突——名字写错,编译器就给你报错或静默失效。
包名必须全小写、单数、无下划线,且不能叫 util 或 v2
包名是 Go 作用域的根,它出现在 import 语句里,也出现在所有导出标识符前(比如 http.Get)。一旦起错,轻则导入时要重命名(myutil "xxx/util"),重则和标准库或其他模块同名冲突。
- ✅ 正确:
user、payment、cache—— 简短、单数、语义明确 - ❌ 错误:
User(含大写)、user_v2(含下划线/版本)、userutil(泛化+冗余) - ⚠️ 特别注意:
util是 Go 社区公认的“危险词”:多个团队都建一个util,最终导入时满屏重命名,IDE 补全也失效
导出标识符首字母必须大写,私有标识符一律小写
Go 没有 public/private 关键字,靠首字母大小写控制可见性——这是硬规则,不是风格。写错就等于“想给别人用,结果别人根本 import 不进来”。
- 结构体、函数、接口、常量:对外暴露 → 首字母大写,如
User、GetInfo、Reader、MaxRetries - 变量、接收器、私有函数:仅包内可用 → 首字母小写,如
userName、validate、接收器u *User - 常见翻车点:
func getuser()写成小写,外部调用时编译器直接报undefined;type user struct小写,别的包连字段都取不到
切片类型命名统一用 SomethingSlice,别写成 SliceSomething
当你需要给切片加方法(比如 Filter、SortByID),必须定义新类型。这时候名字怎么起,直接影响可读性和工具支持。
立即学习“go语言免费学习笔记(深入)”;
- ✅ 标准库示范:
sort.IntSlice、sort.StringSlice—— 所有权威代码都用XxxSlice - ✅ 推荐写法:
type UserSlice []User,然后func (u UserSlice) FilterActive() UserSlice - ❌ 别写:
type SliceUser []User—— IDE 补全时会把它排在S区,和User分离;读起来像“一个叫 SliceUser 的实体”,而不是“用户的切片”
文件名、测试名、接收器名都有隐含约定,不是随便起
这些地方不起眼,但错一个就可能让构建失败、测试不跑、方法调用变模糊。
- 源文件名:全小写,单词间用下划线,如
user_repo.go、http_client.go;绝不能以_或.开头(会被go build直接忽略) - 测试文件:必须以
_test.go结尾,如user_test.go;函数名必须是TestXxx形式,首字母大写 - 方法接收器:用单字母缩写,通常是类型首字母,如
(u *User)、(s *Service);别写(this *User)或(user *User),后者极易和包名、变量名混淆
最常被忽略的一点:包名和目录名最好严格一致。不是语法强制,但 go list、IDE 导入提示、go mod vendor 全部依赖这个约定——你改了包名却没改目录,工具链就开始“装失忆”。










