go命名与排版是强制规范:包名全小写单数且须与目录名一致,导出标识符首字母大写,gofmt强制格式化,接口命名遵循最小原则,违者虽不报错但显著增加协作成本。

Go 代码里命名和排版不是“写得顺眼就行”,而是直接决定能否被 gofmt 接受、是否能通过 lint 检查、别人能不能一眼看懂你在干啥——不按规范,连 go build 都可能不报错,但 go vet 或 golint 会立刻给你标红。
包名必须全小写、单数、无下划线
包名不是随便起的别名,它参与导入路径和调用语法,影响整个 API 的可读性。
- 正确:
http、sql、auth、cache;错误:HTTP、MyAuth、auth_utils、cacheManager - 包名必须和目录名完全一致,比如
./user目录下只能是package user,否则go mod tidy会报错或导致工具链混乱 - 禁用
util、common、helper这类泛化包名;如果真需要,优先拆成stringutil、fileutil等具体功能包 - 命令包(含
func main())也必须叫main,哪怕你有多个命令,也要分目录:如cmd/server/main.go和cmd/cli/main.go,各自 package 都是main
导出标识符首字母大写,私有标识符首字母小写
这不是风格问题,是 Go 的可见性机制。大小写错了,别人就 import 不了,或者意外暴露了内部实现。
- 导出函数/类型/常量:必须首字母大写,如
ParseJSON、UserID、StatusOK - 私有变量/方法:必须首字母小写,如
parseJSON、userID、maxRetries - 特有名词缩写要统一:HTTP、URL、ID、API 必须全大写,如
HTTPClient(不是HttpClient)、URLString、APIKey - 结构体字段要导出才能被 JSON 序列化:想让
json.Marshal生效,字段名就得是Name而不是name
gofmt 是强制标准,不是美化插件
你写的代码格式,最终以 gofmt -w 输出为准。手动调格式、对齐参数、加空格凑行宽,全是白费劲,保存时就被打乱。
- 必须用 Tab 缩进(非空格),VS Code 要关掉 “Insert spaces”、设 “Tab size” 为 4
- 禁止手动对齐字段或参数:结构体字段垂直对齐、函数调用参数按列排开,都是反模式;
gofmt会强制改成单列 - 行宽建议 ≤120 字符,但
gofmt不强制换行;过长表达式应拆成中间变量,而不是靠换行硬撑 - 括号位置、操作符空格、换行时机全由
gofmt决定,别自己猜规则——装好gofmt并绑定到编辑器保存动作,就完事
接口命名只在单方法时用 er 后缀
很多人以为“所有接口都要叫 XXXer”,结果写出 UserServicer 或 OrderProcessor,这违反 Go 的接口最小原则,也误导使用者。
- 正确:
Reader(只有Read)、Writer(只有Write)、Closer(只有Close) - 错误:
UserServicer(含Create/Update/Delete)——该叫UserRepository或UserStore - 两个方法的接口,综合命名,如
WriteFlusher;三个以上,按功能抽象,如Car(含Start/Stop/Drive) - 方法本身不加 er:
IsAdmin正确,IsAdminer错误
最容易被忽略的是:包名和目录名不一致、私有变量首字母大写后被误导出、以及把 gofmt 当成可选步骤——这些不会让程序 panic,但会让协作成本指数级上升,而且越晚修越疼。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











