前往顾页
以后地位: 主页 > 精通Office > 其他教程 >

说说Golang的利专心得

时候:2015-03-01 20:59来源:知行网www.zhixing123.cn 编辑:麦田守望者

13年上半年打仗了Golang,对 Golang十分喜好。现在是2015年,离春节另有几天,从开端学习到现在的一年半时候里,前前后后也用Golang写了些代码,此中包含专业时候的,也有产品项目中的。一向有设法写点Golang相关的总结或感触,决定还是在年前总结下吧。说明下:我只是Golang的喜好者,不是脑残粉,也无意去挑起甚么说话之争。

特性少,语法简朴。GO是崇尚极简主义的,倡导少便是多。这点在它的Spec上特别凸显,一下午的时候绝对可以看完。GO的特性很少,很多GO的利用者都反应,GO的关头字起码完整可以记在年夜脑里。同时它的语法极其简朴,并且语义清楚。

摆设便利。GO是一个强范例静态说话,可以把代码编译为本地机器指令。它的RUNTIME是会在编译时一路链接到履行文件中,这也就意味着我们不需求像JAVA那样装一个JVM。并且编译出的履行文件本身不依靠于其他静态库,完整可以做到轻松的公布。当然,如果你用GO编写了调用一些静态库接口的代码,那么还是需求按照实际环境来摆设这个静态库的。这点在很多从python/java转到go的朋友来讲,非常喜欢。

有较完美的标准库并且较为结实。GO 本身带的标准库是比较全面的,从文件归档、紧缩、加密、数据库到数据序列化,字符格局化、校验和和收集库、同步库等包罗万象。根基上可以或许满足很多根基的需求了。更好的是,这些标准库的质量都非常高,都很结实。接口也较为简朴,有清楚的文档申明。同时跟着这两年的生长,GO的第三方库也多了起来,固然可能没有像python那么多,但是较其生长时候来讲,还是非常不错的。

集成测框架。在之前用C++写代码时,写单位测试不是个容易的事情。需求一些技能和努力才可以做起来。但是在 GO中集成了单位测试框架,只需源码文件以_test.go末端,便可以直接经由过程go test履行单位测试。同时还供应了代码测试覆盖率东西,可以很容易实施主动化测试。除此以外,还集成了基准测试框架服从,可以很容易的测量本身写的函数的运行效力。别的,另有机能分解器,可以在运行时,测试时分解法度的瓶颈点,进而可以进行优化。

健全的代码气势与查抄东西。现在学GO的时候,很多文章和书都会提到go fmt这个号令,同一了代码气势。我觉着这点其实是处理了气势之争了。带来的影响就是他人写的代码感受也是本身写的一样。另有golint,可以遵循go team的气势和请求来写代码。另有go vet可以用来查抄一些在GO中很埋没的坑。

简朴却强年夜的包办理。GO的包办理可能在很多其他说话的包办理看来太弱了,但是在我看来,它处理了我需求的两个问题,一个是循环依靠问题,GO是回绝有循环依靠关系的包;二是包的初始化,每个包的文件都可以实现一个init函数,用来在导入时履行。这点在合作合作时非常有效。

容易编写跨平台代码。如果你用纯GO,不牵涉到CGO的话,你可以非常容易的做到跨平台。只需求在文件后缀.go前,引入_linux,_windows,_x86,_x64等字符为文件名前缀的末端便可以做到只在对应的平台中编译。GO另有build constraints节制代码在甚么前提下编译。如果你用到了CGO,就牵涉到了C的跨平台问题,所以略微费事那么一些,但是问题也不是太年夜。

渣滓收受领受。GC的存在极年夜的降落了并发代码的编写,并且还供应了法度的结实性。做为一个从C/C++做起,有过驱动开辟经历的法度员来讲,GC这个东西是我一向没有浏览过的。对我来讲GC就即是恶梦。但是当我开端试着接管GC时发明,GC真的是处理了法度员的生产力,极年夜的进步了效力。固然目前来讲GO已1.4版本了,但是GC还算不得上优良,遵循GO的线路图,前面会有更优良的GC实现增加出去。

接口与struct。在第一次学习GO的interface的时候,我第一反应是这就是我想要的。固然很多人也在说GO的这个interface的不好,并且说的很有事理,比如老赵的《为甚么我不喜欢GO说话式的接口》。 interface可以经由过程组合扩展为新的interface,struct也能够经由过程组合扩展为新的struct。没有继承,只需组合。可以经由过程匿名组合到达近似继承的结果。可以对interface进行查询,有点近似COM的滋味,但是语法层面上更加简朴。struct到interface的映照是隐式的,不需求声明某个struct实现了某个interface。固然可能会呈现名字上的抵触,但是可以经由过程wrapper进行处理。这类 interface的别的一个好处是单位测试时很容易实现MOCK,这点非常喜欢。也能够看这篇文章《Go interfaces make test stubbing easy》

同一的事情布局。GO定义了项目标目次布局,比如bin目次,pkg目次和src目次。这个和我平常的项目布局是分歧的。之前用C++开辟时我们也是如此摆设布局,所以就这点来讲,我觉着容易过渡。

内建的并发原语。提到GO就不克不及不提到goroutine和channel。便宜的goroutine可让我们欢畅的措置异步任务,channel可以用来互换数据。借助goroutine,可以很容易的实现高机能的办事端。goroutine及其调剂器可以很容易和EPOLL,IOCP等体系机制连络起来,再经由过程Half Sync/Half Async形式,很容易在语法层面上到达同步情势,却不失时能。

2013年初的时候还在做一个客户端,当时利用了C++0x,此中印象最深的事情是lambad,std::function/bind,连络着线程+队列的体例,可以很容易的实现近似于Chromuim的线程模型。在措置UI与慢任务比如读文件,请求收集数据等交互时,为了包管UI的体验,使这些任务异步化是非常有需求的。如果有对Golang体味或熟谙的朋友就会大白,这是近似与Golang的goroutine+channel。但是在利用这个模型时,觉着还是烦琐了些,我要重视工具的生命周期,这个在C++固然有各种智能指针的帮忙,但是不免还会挂一漏万。并且碰到略微的复杂的问题,比如一个慢任务接着一个慢任务时,就会触及到一个任务链,在没有future/promise(Facebook开源的folly库中有个不错的实现futures,后来还发明WINDOWS有个基于actor model的并发库Asynchronous Agents Library非常不错,只可惜目前只在WINDOWS上利用。)机制的帮忙下很容易进入Callback Hell。如许就会导致代码相对来讲比较难保护,并且容易滋长BUG。幸亏当时这个部分的代码不是太多,并且也不是过分于复杂,很容易经由过程自测不变上去。

下面固然提到future/promise, AAL可以处理部分Callback Hell的问题,但是像future还是要用到callback。所以我在想,如果可以做到代码层面上是同步式的,面前倒是异步的就爽了。GO就满足了我这个需求。

GO标准库中还供应了sync包,此中有根基的mutex说,另有RMutex如许的读写锁,另有Once,WaiterGroup等东西。根基满足平常中对锁的需求了。

GO为了帮忙法度员处理在并发经常常碰到的race condition问题,还供应了呼应的race condition东西。另有呼应的死锁检测东西。

固然GO社区有个slogan:"do not communicate by sharing memory; instead, share memory by communicating.",但是每个goroutine之间其实不是完整自力的,一样可以做到经由过程内存共享数据。这个时候只能依托法度员本身去遵循了。并且因为goroutine不是完整自力,panic这类东西便可能会导致全部法度挂失落。这点和Erlang比起来确切不是很好。

蛋疼的defer。用习惯了C++的RAII后,十分恶感GO的defer机制,但是有的时候又不克不及不消。启事就是这个defer不是block级别的,而是函数级别的,需求在函数前往前才获得履行。所以这就会导致在措置一些近似于文件翻开,操纵再封闭的逻辑时非常蛋疼,回到了C的年代,必须手动去Close。

蛋疼的panic。固然我在C++下不怎样用异常,但是对panic这个设想我表示非常的不对劲啊。因为它会影响全局。而要捕获panic就需求用defer。如果panic只是让以后goroutine挂失落我觉着就嗨皮坏了。

没有泛型。GO没有泛型带来的蛋疼处所是,要么就用interface{}来做运行时泛型,要么就本身手动写代码天生器。比如我本身为了天生收集和谈序列化代码就撸了一个天生器。并且因为没有泛型,想实现近似C++ STL的容器与算法根基没太可能,当然体例还是有的,继续利用代码天生器。并且GO1.4干脆引入了一个叫go generate的号令。

 

总结

GO内里其他一些内建的数据布局,比如slice,map等,但这些也是诟病,因为它又没赐与法度员可以享用range关头字的福利。

在GO的所有特性里,最喜欢就是GC,goroutine,channel和interface。而其他的特性(比如下面我枚举的很多特性)我觉着都不是太首要,此中很多都可以在工程中实际,和说话本身没有太年夜关系。

总结上去,这东西就是一个工程东西,各种好用,但是从设想角度讲各种粗糙,没需求过度高估。它算的上工程实际中的好朋友。在写办事端时,它是把利器,起码在写办事端法度时,我本身感受如此。

有朋友说一个说话好不好就看它有没有开辟你的眼界,赐与你新的思惟,我想起码GO在这点上满足了。

------分开线----------------------------
标签(Tag):Golang利专心得
------分开线----------------------------
保举内容
猜你感兴趣