go语言命名是硬性约束而非风格偏好:包名须全小写单数且与目录名一致,导出标识符首字母大写,测试文件名必须为xxx_test.go,函数名须为testxxx,接收器用单字母缩写,切片类型统一用xxxslice。

Go 语言命名不是“起个好听的名字”,而是**直接决定代码能不能跑、别人能不能用、工具能不能识别**——写错一个字母,import 就失败,go test 就跳过,IDE 补全就失灵。
包名必须全小写、单数、无下划线,且和目录名一模一样
这是硬约束,不是风格偏好。Go 工具链(go build、go list、VS Code 跳转)都靠这个映射路径和包名。不一致会导致“找不到包”或测试不执行。
-
auth/目录下,必须写package auth;写成package authz或package user_auth,本地可能凑合过,CI 就报错 - 别用
util、common、helpers—— 这些名字不表达职责,后期想拆包时会发现函数互相强耦合,谁都不敢动 - 缩写可以,但得是通用词:
http、sql、json合法;usr(user)、cfg(config)就不行,除非整个团队明确约定并文档化
导出标识符首字母必须大写,否则外部包完全看不见
Go 没有 public 关键字,可见性全靠首字母大小写。小写 = 包内私有;大写 = 可被其他包调用、可被 json/datastore 序列化 —— 写错就是静默失效。
- 结构体字段要存进 Datastore 或转成 JSON?
FirstName✅,firstName❌(直接被忽略) - 函数想让别人调用?
GetUser✅,getuser或getUser❌(编译不报错,但其他包里user.GetUser会提示 undefined) - 接收器名用单字母缩写:
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)都不会被发现 - 测试文件里的
package声明必须和源码包一致(如源码是package user,测试也得是package user),不能写成package user_test—— 否则访问不到未导出函数
github.com/you/app/auth 是导入路径,auth 才是包名。改路径不影响包名,改包名却可能让所有调用方崩溃。名字一旦对外暴露,就基本不能动了。golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











