Go函数导出性由首字母大小写强制决定:大写可跨包调用,小写仅包内可见;命名须驼峰式且缩写全大写(如HTTPServer);动词开头、职责单一;导出函数需Godoc注释且参数≤3个;error必须最后返回。

Go 函数名首字母大小写直接决定能否被其他包调用——大写是导出(public),小写是包内私有(unexported),这不是风格问题,是编译器强制执行的可见性规则。
函数是否导出:首字母大小写是硬性语法要求
Go 不提供 public 或 private 关键字,导出性完全由标识符首字母决定:
- 以大写字母开头(如
WriteToDB、GetHTTPResponse)→ 其他包可导入并使用 - 以小写字母开头(如
writeToDB、getHTTPResponse)→ 仅当前包内可见,天然封装 - 若你写了
func writeToMongoDB()却在main.go中调用失败,报错undefined: writeToMongoDB,原因就是它没导出,不是路径或 import 问题
驼峰命名 + 缩写全大写:Effective Go 的刚性约定
所有标识符必须用驼峰式(CamelCase),且缩略词保持全大写,否则即使能编译,也会破坏一致性、误导协作者:
- ✅ 正确:
HTTPServer、XMLParser、IDGenerator、WriteToDB - ❌ 错误:
HttpServer(Http混合大小写)、writeToDb(Db应为DB)、WriteToMongodb(Mongodb非标准缩写) - 缩写词如
DB、ID、URL、HTTP、XML必须全大写,不能拆分或小写
动词开头 + 职责单一:让调用意图一目了然
函数名不是标签,是行为承诺。命名应体现“做什么”,而非“是什么”:
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
立即学习“go语言免费学习笔记(深入)”;
- 用动词开头:
CalculateTax、ValidateEmail、SaveUser,避免DoSomething、HandleUser这类模糊表达 - 布尔返回函数加前缀:
IsValid、HasPermission、CanWrite,不写Valid或Permission - 一个函数只做一件事:不要把
ParseJSON+ValidateData+SaveToDB塞进一个ProcessUserInput;拆开后每个函数长度控制在 10–20 行内更易读、易测、易复用
导出函数必须带 Godoc 注释,且参数不超过 3 个
导出函数是你的 API 面向外部的契约,没有注释等于没有文档,没有约束等于后续难以演进:
- 每个导出函数顶部必须有
/**/注释,说明功能、参数含义、返回值含义、可能的 error 类型(例如:// WriteToDB writes a document to MongoDB. Returns error if connection fails or write times out.) - 参数建议 ≤3 个;超过时改用结构体传参,例如:
type WriteOptions struct { Timeout time.Duration, Retries int },再写WriteToDB(doc, opts WriteOptions) - 错误必须作为最后一个返回值显式返回:
func ReadConfig(path string) ([]byte, error),不可吞掉或转成 panic
最容易被忽略的是:缩写全大写和导出性绑定是 Go 的语言机制,不是“建议”。写错 writeToDB 和 WriteToDb 看似只是风格偏差,实则分别导致“不可用”和“误导他人以为可导出但实际破坏缩写规范”。这两点一旦在初期松动,后期重构成本远高于早期统一。

















