第一篇go database/sql 源码分析 的文章对其作者(Brad Fitzpatrick大神 memcached的作者 go语言项目组成员)给予高度评价,但是个人认为go database/sql 的实现不是完美无瑕的
优点:
接口设计简单,清晰,一致,友好:应用层的调用接口和驱动层的实现接口几乎一致,使用者毫无压力;
缺点:
包内部实现异常复杂、杂乱,给人一种错觉到底是因为逻辑就复杂还是实现的有问题;
这也是大牛的特点,你不要管我的实现,我只要保持接口的清晰,你只管用就好了,至于内部实现是我自己的事情,我不保证可读性,我可以使用我认为的任何技巧;
个人觉得database/sql包内部实现的不科学的地方:
1.为了实现并发,大量的使用锁的结构: 这个有违golang 的编程哲学,但是有时锁确实是解决办法的好省力办法,但是太多的锁分布在代码中,会使代码非常难看;
2.包中各个实体资源的复用、回收、清理等逻辑不够清晰,异常混乱,阅读代码很难搞清楚各个实体是怎么个依赖关系,怎么个生存期;严重怀疑作者是怎么去设计、怎么去测试,
是我水平不够,总是感觉实现不够优雅,后来想想database/sql的作者,Brad Fitzpatrick大神毕竟也不是等闲之辈,是我功力不够了,仍需加油。
不过我对大神不是无条件的崇拜,如果是我来实现database/sql,有什么更好的方式,这个确实是自己应该思考的问题;
有疑问加站长微信联系(非本文作者)