本文最早由davecheney发表于 GopherCon Israel 2020,今天早上在GitHub上开源,github.com/davecheney/…
Dave Cheney是谁?
Dave Cheney是Go编程语言的开源贡献者和项目成员。Dave Cheney是科技界备受尊重的代言人,他讲的是软件设计,性能和Go编程语言等各种主题。从2009年起,Dave Cheney就开始在世界各地写作,教学和演讲golang。Dave Cheney目前是VMware技术人员。在他的前公司收购之前,他曾在位于西雅图的公司Heptio担任工程师,专注于构建工具,帮助开发人员提高Kubernetes的工作效率。 更多了解Dave -> dave.cheney.net/about
编写简单,可读,可维护的Go代码的十个建议
Package的单一职责原则
对于一个Go package来说,好的设计是只表达一个主题,提供的是一系列与该主题相关的方法,并且具有规范的命名。试着把你package的名字想象成一个产品营销的演讲,尽量用一个最恰当的词来描述它所提供的内容。
错误的及时处理
健壮的代码总是能在程序崩溃之前及时地处理错误。尽管 if err!= nil { return err }
冗长地出现在代码当中,但是它是非常有用的,总能在出错的地方及时给你一个反馈,所以不要抵触这种错误处理。不过对于panic
和recover
的使用来说,就要谨慎和克制一些。
及时返回避免嵌套
你每多一个条件嵌套,都会或多或少地对程序的性能造成影响,也会造成可读性的降低。所以尽量避免多层嵌套的控制流程。
是否使用并发由调用方决定
如果你的库使用了并发,让调用者选择是否要并发运行你的库或函数,不要强加于他们。
了解你的goroutine的生命周期
Goroutines占用的资源包括锁,变量,内存等。只有及时停止goroutine才能释放这些资源,所以你务必 了解你的goroutine的生命周期。
Avoid package level state
Seek to be explicit, reduce coupling, and spooky action at a distance by providing the dependencies a type needs as fields on that type rather than using package variables.(实在不知道怎么解释,就不误人子弟了)
简洁至上
简洁并不是复杂的反义词,而是意味着可读性和可维护性。在可能的情况下,选择更简洁的解决方案
测试用例是你package API的门面
尽管用户使用的是你的API,但是详尽的测试用例能够给用户足够的安全感。
Talk is cheap, show me your benchmark
有太多的代码打着提升性能的旗号而没有考虑其可维护性。要警惕过度优化带来的紧耦合、封装性差、可读性差的问题。如果你选择承担这些成本,一定要给出有说服力的理由。
克制是一种美德
适当地使用goroutines、channels、locks、interface、embedded等技术,切勿炫技。
可维护性
可维护性包括清晰,易读,简单等方面。你能想象到在你走后,你同事会如何看待你你留下的一坨代码吗?所以你现在就应该考虑一下如何让后面的人更容易地接手你的代码。
紧跟Go官方blog的步伐,追踪热点资讯,尽在go official blog。
如发现文中错误,可至公众号反馈(也欢迎技术交流),一经采纳有红包奉上哟。