在实用科技屋写点实在的——Go 项目一多,团队里有人写 httpHandler,有人写 HttpHandler,还有人直接起名 MyHandler,三天后自己都忘了哪个是处理登录、哪个是校验 token。这不是风格问题,是协作成本。
包名小写,别加下划线
Go 的包名统一小写、简洁、语义明确。比如处理用户逻辑的包就叫 user,不是 user_mgr 或 UserPackage。下划线和大驼峰在 Go 里显得突兀,也容易让 import 路径变长、难读。
变量名要“说人话”
别为了省两个字母写 u 代替 user,也别用 tmp、data 这类万金油名字。如果是个缓存过期时间,就叫 cacheTTL;如果是用户注册时传来的邮箱,就叫 email 或 regEmail。名字短不等于好,清晰才关键。
函数首字母大小写 = 公私分明
Go 没有 public/private 关键字,靠首字母大小写控制可见性:SendEmail() 外部可调用,sendEmail() 只在本包内可用。这个规则必须守住,否则封装形同虚设,别人随时可能绕过你的校验逻辑直接调内部方法。
错误处理别吞掉
看到 err != nil 就 return,别只写个 log.Println(err) 然后继续往下跑。更别用 _ = os.Remove("temp.txt") 这种写法——文件删没删成功?没人知道,但程序已经当它删掉了。
接口定义越小越好
别一上来就定义个 UserInterface,塞进 12 个方法。Go 崇尚“小接口”,比如只读用户信息,就定义:
type UserReader interface {
GetByID(id int) (*User, error)
}需要写操作再另加 UserWriter。这样测试方便、替换灵活,连 mock 都不用写一堆空实现。
结构体字段导出看场景
对外暴露的字段首字母大写(Name string),内部用的小写(createdAt time.Time)。别图省事全大写,也别怕麻烦全小写还配一堆 Getter 方法——Go 不吃这一套。
注释不是装饰品
每个导出的函数、类型、变量,都该有一行简明注释,说明“它干什么”,不是“它怎么干”。比如:
// ParseConfig 从 YAML 文件加载配置,失败时返回非 nil error
func ParseConfig(path string) (*Config, error) { ... }而不是写 // 调用 ioutil.ReadFile...然后 yaml.Unmarshal...——代码自己会说。
写 Go 不是比谁语法玩得溜,是比谁写的代码上线后三个月还能被新同事一眼看懂。规范不是枷锁,是让每个人少花十分钟猜意图、多花十分钟修 bug 的日常工具。