1.每个package实现单一的目的
可以把package名称想象成一个升降梯,用一个词来描述package的内容;
可以先用xmind把package名称规划,然后把各种独立的业务单独成package,不用害怕package过多,分成逻辑块的代码只需要关注自己逻辑部分的package
2.显示处理错误
错误if err!= nil {return err} 可能冗长,但是出现问题时,能够准确定位问题更值得推崇;
panic和recover也不例外,确保错误溢出不影响程序运行是多么重要
3.尽早返回,而不是使用深嵌套
非常复杂多余的if循环,只能加深对程序的憎恶程度;尽早的处理异常场景返回,是不可多得的方式
4.让调用者选择并发
go优秀的并发技能,不使用就好比有枪不用还使用棍棒;如果你的库使用了并发,需要处理好并发的同步和并发的异常
5.在启动一个goroutine时,需要知道它何时会停止
Goroutine会占用资源:锁、变量、内存等;释放这些资源的可靠方法是停止相应的goroutine;
永远不要觉得交给系统的gc就完事了,得清楚每个goroutine的停止过程以及善后处理
6.避免package级别的状态
如果出现重复引用,会出现耦合和诡异的问题
7.简单,可维护性很重要
简单不意味着粗糙,而是可读性和可维护性;
如果可以选择,请遵循比较简单的解决方案;可以随着业务的升级去进行迭代升级;
清晰,易读,简单是可维护性的所有方面。离开后,您可以努力维护的东西可以保留吗?您今天该如何做,才能使以后的人们变得更轻松?
8.编写测试所用package api的行为
确保测试了用户可以观察和依赖的行为
9.如果觉得慢,首先编写benchmark来证明
以表现为名犯下了许多危害可维护性的罪行。优化会破坏抽象,暴露内部和紧密耦合。如果您选择承担这笔费用,请确保有充分理由这样做。
10.节制是一种美德
适度使用 goroutine,channel,锁,接口,嵌入。