Hacks on Computer Vision

go proverbs —— Go箴言

2015.12.04

今天看到谢大的微博,看到rob pike在今年11月18日的Gopherfest的一个关于**Go Proverbs的视频,有Go箴言,赶紧学习~另附视频地址(需翻墙),简单版本的文字地址,图文并茂版本的地址,供大家一起学习。

看了视频的开头,我才知道原来“围棋”的英语单词是“Go”,哈哈,easy to learn,hard to master,说的一点不错。

go的第一条箴言就是著名的“Don’t communicate by sharing memory, share memory by communicating.”,“不要通过内存共享来通信,通过通信来共享内存。”与其相关的就是channel的使用了。这个看起来很容易理解,但使用时如何设计channel的使用还是有很多要注意的地方。我在目前工作的一个重构项目中就遇到了这个问题,也在搜索相关的资料,具体信息会在项目完成后,再写篇博客详细讲解。

第二条箴言是“Concurrency is not parallelism.”,这个在golang官网有详细解释。其实,如果接触过GPU编程,就会比较了解并行的概念。并行强调的是同一个处理逻辑同时进行,这也是为什么使用GPU可以让图像处理算法提速很多的原因。而并发强调的是不同的处理逻辑同时进行,在Go中就是goroutinechannel的使用。

第三条箴言是“Channels orchestrate; mutexes serialize.”,这句话讲明了channelmutex的用途:通过channel可以非常方便的调控和组织一个软件结构中的各个组件,而mutex则让操作串化。Go语言的一个特性是并发性好,其中就是使用channel来控制和连接不同的goroutine,锁的重要性在高并发的情况下不言而喻,也是需要注意的地方。

第四条箴言是“The bigger the interface, the weaker the abstraction.”,接口越大,抽象性越弱。Rob在视频中举了io.Readerio.Writer的例子作为说明,接口要设计的简单,才能更加通用。我在目前的工作中,还使用不到interface这个功能,每次写了interface接口,再想想感觉不合适就又删了,所以关于这条,我没有什么经验感慨之类的。

第五条箴言是“Make the zero value useful.”,学会利用零值。这个在设计和使用struct时更加游泳,比如mutex,在struct只需要声明就可以直接使用了,就是因为mutex已经做了零值处理。这个建议不错,改天看看mutex的实现,看看如何利用好零值。

第六条箴言是“interface{} says nothing.”,空值是个好东西,但别乱用,乱用就会召唤出“八阿哥”,哈哈。interface{}类似C语言中的void*,使用时注意类型检查和转换就可以了。

第七条箴言是“Gofmt’s style is no one’s favorite, yet gofmt is everyone’s favorite.”,“没人喜欢代码gofmt后的样式,但gofmt是每个人都喜欢的工具”。这个感觉没啥可说的,工具而已,使用vim-go插件可以在保存时自动gofmt,我感觉就足够了。

第八条箴言是“A little copying is better than a little dependency.”,关于code reuse的回应,没必要为了复用代码而写依赖库,直接复制代码也可以让编译更加的快速。这个我感觉可能会引起误解,这里的复制不是大段的复制代码,而是说,通过复制一点代码,从而减少依赖树的数量。可能import的某一个package中还import了好几个其他的package,如果仅使用这个package中的很少一部分功能,能直接自己写的就不要去import这个包了。这个倒是让我想到,有些图像处理的框架,仅仅就使用了OpenCV中读图和写图的功能,就不得不安装庞大的OpenCV,写代码的人是方便了,而用的人就麻烦了,解决依赖真的很烦!!!

第九条箴言是“Syscall must always be guarded with build tags.”,这个限制是要加的,毕竟系统调用不是各个平台都一样的,加上build标签,这样别人编译时就会有提示,方便别人,也是方便自己。

第十条箴言是“Cgo must always be guarded with build tags.”,这个同上哈~

第十一条箴言是“Cgo is not Go.”,我还没用过Cgo,目前的情况是用Go都可以解决,所以也就不说啥了。

第十二条箴言是“With the unsafe package there are no guarantees.”,慎用unsafe包,因为无法保证其稳定性。

第十三条箴言是“Clear is better than clever.”,干净、清楚的代码更好啊!在写代码时,完成需求是一方面,写出简单、可维护的代码也很重要,所以写代码时,也得停下来想一想怎么设计,不然来了后续需求,可能还得改,哈哈~洒家最近对于这个是感慨很多!

第十四条箴言是“Reflection is never clear.”,reflection是go语言的又一个难点,初学者就先不要考虑了,我还没用过这个包,只知道很高级,哈哈

第十五条箴言是“Errors are values.”,读了Errors are values的博文,有了一些简单的认识,因为error是值,所以可以放入到struct中,可以赋值,自然可以处理,这样就可以避免无穷无尽的if err != nil之类的错误处理了。用惯了Python,总想着Exception,得改改思路了。

第十六条箴言是“Don’t just check errors, handle them gracefully.”,这个感觉和上面的差不多,毕竟go功力尚浅,还需多加锻炼啊!

第十七条箴言是“Design the architecture, name the components, document the details.”,架构设计、命名和文档,慢慢修炼。。。

第十八条箴言是“Documentation is for users.”,写文档的事,还是那句话,方便别人,方便自己。

这些箴言,更偏向建议一些,在使用go编程时,可以多多参考。

__EOF__

本文作者HackCV
版权声明本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
本文链接https://hackcv.com/posts/go-proverbs-go%E7%AE%B4%E8%A8%80/

发表评论