Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
21 changed files
with
829 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,148 @@ | ||
> 本文发表时间:2016年3月28号 | ||
2016-07-07最新修改,添加GC演变说明。 | ||
|
||
|
||
我在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语言自带标准的性能分析工具,包括CPU、内存、阻塞操作(http请求,数据库请求, | ||
time.Sleep等)在内的都可以测量,influxdb就是利用这些工具实现了数据库的常量时间访问。 | ||
|
||
|
||
### 那么对于网上常常被喷的那些所谓的Go的‘问题’呢? | ||
|
||
##### 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的吞吐率。 | ||
|
||
##### 泛型 | ||
其实刚从其它语言过来时,我或多或少会在写Go代码时用到模版的思想,但是后 | ||
面发现,这样会让代码更难维护,因此,写Go代码就要用Go的哲学和思想。 | ||
|
||
写过C++代码的都知道:抽象是一把双刃剑,过度的抽象就可能存在潜在的问题。 | ||
在我看来,Go所具有的OO思想,是简洁的,是纯粹的,是组合的核心思想。 | ||
|
||
编程现在就是化繁为简,充分利用组合的思想(也是Unix程序设计提倡的思想),可 | ||
以让我们的开发模型和项目代码大大简化、返璞归真 。Go的OO思想充分体现了三位大神作者的 | ||
编程和设计功底,估计也只有Unix的作者才能写出这么完美的OO实现了! | ||
|
||
##### GOPATH | ||
对于新手来说,GOPATH很难理解清楚,我当时刚接触时,也是迷糊了一段时间。 | ||
现在则是混合了两种方式,第一种,在默认的GOPATH下的src中存放项目;第二种,自定义一个 | ||
临时的GOPATH,然后存放项目。后者的独立性更好,但是全局使用go build ,go test等命令时就 | ||
会有问题,比如手动导出GOPATH才行: | ||
|
||
```bash | ||
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来设计实现一个系统,也 | ||
许这种美妙只有真正深入用过的人才能体会 ;) | ||
|
||
|
||
### 广告时间 | ||
欢迎大家加入Golang隐修会,QQ群894864,欢迎加入这个大 | ||
家庭,这里有所有你想要的,而且热心大神很多哦! | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,4 @@ | ||
>本文发表时间:2017年5月17号 | ||
### 前言 | ||
很早以前crypto/tls(TLS长连接库)和net/http的性能不敢恭维,因此我们都使用Nginx做反向代理,但是Go1.8将要来了,这种格局即将被打破了! | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,5 @@ | ||
|
||
> 本文发表时间:2017年8月15号 | ||
### $ go build -x | ||
-x会列出来go build调用到的所有命令。 | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.