25

使用Golang工作400天后的感受

 4 years ago
source link: https://studygolang.com/articles/25554
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

【转载】使用Golang工作400天后的感受

转载: https://blog.csdn.net/kwame211/article/details/79267088

我在2011年就听说了Go并学习了一段时间,坦白的说,那时候对Go是比较无感的,因为并没有看到Go特别亮眼的地方,可能和我使用C、Erlang、Java有关,这三种语言可以写高性能、高并发、高可用的服务;包含了面向过程、面向并发、面向对象的思想,我觉得我并不需要再学习Go,何况那个时候好像也没宣传的那么优秀。

一切都发生在418天前,因为工作的需要,我开始写Go了,本来预期是一段压抑的旅程(被迫使用其它语言的同学可能都会有此感受),结果收获了非一般的惊喜、非一般的效率、非一般的开发体验。

先用几个词来总结一下我的感受:简洁、标准、组合、创造力、生产力!

特别是生产力,由于Go优秀的标准库、完美的代码安全、全面的三方库、完善的测试机制、完善的标准管理工具,使用Go给我们小组带来了极大的生产力。

总之,在使用过的语言中,除了Erlang外,我还没在其它语言上感受过如此之高的生产力(可能笔者的见识比较狭隘,请轻喷;) )。 最近思考了很多,也横向对比了一些,Go具有高生产力的原因如下:

  • 不一定需要IDE

我主要使用的开发工具一个是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就是利用这些工具实现了数据库的常量时间访问。

Golang的问题

那么对于网上常常被喷的那些所谓的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语言的总结

Go从出身来看更像学院派语言,但是实际上它是彻头彻尾的工程语言,特别是它很适合我们团队,很适合基础架构、中间件、云计算平台、PasS平台的开发,因为说它是云时代的未来第一语言,丝毫不为过。

就我这边的项目而言,分布式日志平台、搜索系统、消息推送等项目中,避免了JVM或者EVM的麻烦,实在是太美好了,所以,如果条件允许,我会完全选择纯Go来设计实现一个系统,也许这种美妙只有真正深入用过的人才能体会。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK