转载: https://blog.csdn.net/kwame211/article/details/79267088git
我在2011年就据说了Go并学习了一段时间,坦白的说,那时候对Go是比较无感的,由于并无看到Go特别亮眼的地方,可能和我使用C、Erlang、Java有关,这三种语言能够写高性能、高并发、高可用的服务;包含了面向过程、面向并发、面向对象的思想,我以为我并不须要再学习Go,况且那个时候好像也没宣传的那么优秀。程序员
一切都发生在418天前,由于工做的须要,我开始写Go了,原本预期是一段压抑的旅程(被迫使用其它语言的同窗可能都会有此感觉),结果收获了非通常的惊喜、非通常的效率、非通常的开发体验。github
先用几个词来总结一下个人感觉:简洁、标准、组合、创造力、生产力!数据库
特别是生产力,因为Go优秀的标准库、完美的代码安全、全面的三方库、完善的测试机制、完善的标准管理工具,使用Go给咱们小组带来了极大的生产力。编程
总之,在使用过的语言中,除了Erlang外,我还没在其它语言上感觉过如此之高的生产力(可能笔者的见识比较狭隘,请轻喷;) )。 最近思考了不少,也横向对比了一些,Go具备高生产力的缘由以下:数组
我主要使用的开发工具一个是liteIDE,另一个就是Vim,特别是在本身实验一些好的想法时,Vim用的更多。Go开发时的简洁和对其它第三方组件无依赖性,决定了Go能够在任何地方写,任何地方运行。曾经我尝试过用Vim去写Java,结果无奈的放弃了这个想法。对于不少环境下来讲,不依赖IDE是很重要的。缓存
之前编译C++,Erlang程序,离开座位去喝杯茶,吹吹牛是很正常的事。可是自从用了Go,这种闲逛行为貌似变得更像是在打酱油,由于一个完整的项目最多仅仅须要数秒到数十秒!!这个对于初接触Go的同窗来讲,很神奇;这个对于提升程序员和项目组的生产力来讲,很重要!安全
使用Go的标准库也是很是享受的。从标准库的设计就能看得出,建立Go语言的那几位图灵奖大神,不只仅有异常深厚的理论储备,还有着很是丰富、很是普遍的生产实践经验,由于Go语言解决了不少真实系统设计中,经常会遇到的问题。例如,能够很是简单的使用http服务、为socket设置读写超时、统计服务器信息、单元测试压力测试、多样化的性能测试等等,全部的这些让写出高可用、高性能的服务简单了数倍!服务器
Map是我使用很是多的数据结构,大概10-20%的代码都使用了Map。所以做为一个静态语言,Go把Map内置为标准的数据类型,是很是棒的,大大简化了使用步骤,提高了性能。Go语言中的动态数组slice,对于实际使用中也是很是关键的,配合内置函数append和range,slice的使用灵活度使人难以置信。经过这些内置数据结构和内置函数,Go程序员在处理各类数据结构时就掌握了既标准又强大的武器,也是Go语言之因此简洁的缘由之一。网络
不知道你们有没有作过项目总结,根据我多年的经验,项目中有一些最浪费时间的地方,其中一个地方就是代码格式问题。在各大论坛、各大语言板块都充斥着括号位置、空格、缩进的讨论,这些讨论在Go语言中均可以打住了。go fmt能够自动帮咱们处理好这些问题,让咱们的每一个源码文件的代码格式都是统一规范的。在实际应用中,这个特性能够大大提升团队的开发效率:
最简单的,写代码时,你不再用在=两边,函数参数的后面等地方加上空格了,只要输入go fmt myProject,一切问题都烟消云散。
使用过Go语言的同窗,应该都知道程序编译后仅仅生成一个可执行的二进制文件,很是方便,可是我仍然认为咱们大大低估了这个语言特性的好处,特别是在项目的后续开发、维护过程当中。如今社会,网络带宽和存储设备都再也不昂贵,可是部署、配置、管理、升级各类软件服务的代价仍是较为高昂的。若是你们本身管理过多个系统、集群,就会知道:升级或安装依赖库、JDK等组件时,总会碰到特别痛苦的时候,几天的加班加点搞定一个问题都有可能!而纯Go写的程序则不
同样,无论项目处于在哪一个阶段,咱们须要的也仅仅是一个binary文件,对于提升生产力来讲,这个无疑是很是巨大的。
Go的测试框架是很是棒的,和其它语言不一样的是:咱们仅仅使用Go语言自带的标准化测试框架,就能够很好实现各类测试功能:单元,黑盒,白盒,压力测试等等。除了标准测试外,还有不少第三方的优秀测试框架,可是要记住的是:最好只使用一套测试框架,这样能保持项目的完整性和一致性。就笔者的经验来看,目前的标准测试框架足够用了,若是须要单步断点能够看这里。
Go语言自带标准的性能分析Tools,包括CPU、内存、阻塞操做(http请求,数据库请求,time.Sleep等)在内的均可以测量,influxdb就是利用这些工具实现了数据库的常量时间访问。
那么对于网上经常被喷的那些所谓的Go的"问题"呢?
1)GC
Go语言从1.3开始,GC的改进就在持续进行中,1.5中,GC改为三色mark and sweep后,性能获得了极大的提升,在1.6中,对于内存占用很高、对象不少的系统又进行了一次大优化,能够说,如今的Go程序通常不存在GC问题,除非:分布式缓存、数据库、消息推送这样海量对象的场景,这时候须要本身作好可复用对象管理、合并部分小对象、将一些小型的struct结构定义为值类型而不是指针类型、还能够从业务层面和架构层面进行优化设计等等。
不过,虽说不太须要担忧GC问题,可是你们仍是最好学习一下Go的GC原理和内存管理,理解底层原理对于不少时候快速的定位解决问题是大有裨益的。
PS: 2016年7月7日补充,昨天看到一个使用GO做为核心语言的国外大型视频直播网站分享了关于GC的演变史,直接说结果吧:1.2版本的时候,GC STW时间是2秒左右,到了1.6版本再结合一些GC参数调优,达到了30-50ms的级别,目前的1.7版本因为将一些STW工做放到了并发去执行,所以GC时间到了1m级别,整整上千倍的提高,基本上延时已经不是问题了。后续版本将进一步改进STW问题,同时大大改善GC的吞吐率。
2)泛型
其实刚从其它语言过来时,我或多或少会在写Go代码时用到模版的思想,可是后面发现,这样会让代码更难维护,所以,写Go代码就要用Go的哲学和思想。写过C++代码的都知道:抽象是一把双刃剑,过分的抽象就可能存在潜在的问题。
在我看来,Go所具备的OO思想,是简洁的,是纯粹的,是组合的核心思想。编程如今就是化繁为简,充分利用组合的思想(也是Unix程序设计提倡的思想),可让咱们的开发模型和项目代码大大简化、返璞归真 。Go的OO思想充分体现了三位大神做者的编程和设计功底,估计也只有Unix的做者才能写出这么完美的OO实现了!
3)GOPATH
对于新手来讲,GOPATH很难理解清楚,我当时刚接触时,也是迷糊了一段时间。
如今则是混合了两种方式,第一种,在默认的GOPATH下的src中存放项目;第二种,自定义一个临时的GOPATH,而后存放项目。后者的独立性更好,可是全局使用go build ,go test等命令时就会有问题,好比手动导出GOPATH才行:
mkdir sunface cd sunface-bench/ export GOPATH=$PWD go get -v github.com/otoolep/bleve-bench go install github.com/otoolep/bleve-bench/cmd/bench/. $GOPATH/bin/bench -h
Go从出身来看更像学院派语言,可是实际上它是彻头彻尾的工程语言,特别是它很适合咱们团队,很适合基础架构、中间件、云计算平台、PasS平台的开发,由于说它是云时代的将来第一语言,丝绝不为过。
就我这边的项目而言,分布式日志平台、搜索系统、消息推送等项目中,避免了JVM或者EVM的麻烦,实在是太美好了,因此,若是条件容许,我会彻底选择纯Go来设计实现一个系统,也许这种美妙只有真正深刻用过的人才能体会。