go语言命名直接决定代码能否编译、导入、调用和测试:包名须全小写且与目录严格一致;导出标识符首字母必须大写;测试文件名必须为xxx_test.go;接收器名用单字母;切片类型统一用xxxslice。

Go语言命名不是“起个好听的名字”,而是直接决定代码能不能编译、包能不能导入、方法能不能被调用、测试能不能跑——写错一个字母,go build可能不报错但import失败,go test直接跳过,IDE补全完全失灵。
包名必须全小写、单数、无下划线,且与目录名严格一致
Go工具链(go list、go build、VS Code跳转)靠目录名和package声明的完全匹配来定位包。不一致会导致“cannot find package”或CI环境构建失败。
-
auth/目录下只能写package auth;写成package authz或package user_auth,本地可能凑合,CI必挂 - 禁止用
util、common、helpers——这些名字不表达职责,后期拆包时函数强耦合,谁都不敢动 - 缩写仅限通用词:
http、sql、json合法;usr(user)、cfg(config)不行,除非团队文档明确定义并全员遵守 - 包名不能和标准库冲突:
text、net、io尽量避开,否则导入时得重命名(mytext "github.com/you/text"),补全和文档都受影响
导出标识符首字母必须大写,否则外部包完全不可见
Go没有public关键字,可见性100%由首字母大小写控制:小写 = 包内私有;大写 = 可被其他包调用、可被json/datastore序列化。写错就是静默失效。
- 结构体字段要进JSON或Datastore?
FirstName✅,firstName❌(字段直接被忽略) - 函数想让别人调用?
GetUser✅,getuser或getUser❌(编译不报错,但user.GetUser提示undefined) - 常量对外暴露?
MaxRetries✅,maxRetries❌(别的包连import进来都看不到) - 接收器名用单字母缩写:
func (u *User) Validate()✅,不用func (user *User) Validate()——IDE补全更准,签名更紧凑
切片类型统一用XxxSlice,别倒着写
当你需要给切片加方法(比如Filter、SortByID),必须定义新类型。命名影响IDE补全顺序、阅读直觉和社区一致性。
- 推荐:
type UserSlice []User→users.FilterActive(),补全时和User紧挨着,语义清晰 - 反例:
type SliceUser []User→ 补全排在S区,和业务类型割裂;读起来像“一个叫SliceUser的实体”,不是“用户的切片” - 标准库全是
IntSlice、StringSlice,跟风不是盲从,是降低协作成本
测试文件名和函数名有硬性格式,错一个就go test不认
这不是建议,是Go构建系统识别测试的唯一入口。名字不对,等于没写测试。
- 文件名必须是
xxx_test.go(下划线 +_test.go结尾);xxxTest.go或test_xxx.go会被go build直接忽略 - 测试函数必须是
func TestXxx(t *testing.T),首字母大写,参数类型严格匹配;func testXxx()或func TestXxx(t *testing.B)都不会被发现 - 源文件名也需规范:全小写,单词间用下划线,如
user_repo.go、http_client.go;绝不能以_或.开头(go build直接跳过)
最易被忽略的是包名与目录名的一致性、导出标识符首字母大小写的静默失效,以及测试文件名的下划线位置——它们都不报编译错误,却让协作和自动化流程在关键节点突然中断。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











