You are on page 1of 6

Go的优势

go是基于现实的需求。⾯对⼀个必须要实现的需求,当创
造⼀⻔语⾔⽐改造其他语⾔的代价都⼩,那创造语⾔就是必
然结果。拍拍脑袋搞出来的语⾔不是没有,但是都是肯定发
展不起来的,因为没有需求,没有发展起来的动⼒。所以要
理解 go 横空出世,光从 go 本身的特性看是⼀⽅⾯,另⼀⽅
⾯是要考虑究竟是什么需求,让 Google 最终没有选择改造
⼀⻔语⾔,⽽是新创造了⼀⻔语⾔。

简单的说:⼤规模服务器是互联⽹⾏业发展的必然结果;
分布式系统是⼤规模服务器的最优解;⽽ k8s 和容器是分布
式系统的最优解;go 是 k8s 的最优解。⾄于某些 go 语⾔好
⽤的细节,只是那三个⽼头创造 go 时候顺便附带的。

Google 这个公司,很可能拥有全世界最⼤、最复杂的服务
器,包括软件和硬件。这些软件和硬件有两个需求:开发迭
代的需求,和维护的需求。所谓开发的需求,就是要满⾜迭
代快的特点,⽐如最基本的,你不能说你发布⼀个新版本,
所有服务器就需要停机维护,这不扯淡呢?⽽维护的需求,
就是要⽤尽量少的⼈⼒,最⼤化的保障服务器的稳定,简单
粗暴的说,能让机器⾃动做的事情,就不要⽤⼈来搞了,⽐
如流量⾼峰时候扩容,等等。

基于这两个⼤需求,Google 最终拿出的最佳实践是分布式
架构的容器调度系统 kubernetes 。如果你稍微关⼼过 web
后台开发,当下你基本上都会听说过这个词,或者它的缩
写:k8s。如果说把 k8s 的特性都⽤⼤部分⼈能听懂的语⾔
在这⾥列出来,那我今天就不⽤⼲别的了。简⽽⾔之,你知
道 k8s 是当下管理⼤规模集群的最优解就可以了。⽽能实现
这个最优解的最优解,不是 java/cpp/python/php,⽽是
go。

很多⼈其实并不理解这个结论,因为不管是什么功能,go
能实现的,j/c/p/p 之类基本上也都能实现,或者修改修改也
都可以实现,为什么只能是 go ?这是因为,服务器并不只
有开发的⻆度,还有维护的⻆度。k8s 如果是⽤ java 写的,
那意味着每个服务器需要维护⼀套 jre;这还不算,k8s 的组
件有些是以容器形式启动的,这意味着除了服务器本身要有
jre,k8s 组件容器⾥也要有套完整的 jre 。⼀台服务器,⼀
个 jre,多个 jar ,这可以接受;但是每⼀个容器⼀个 jre,这
是不能接受的,不仅浪费资源,也会降低部署速度,提⾼维
护成本,因为当年的 java 对容器可没什么⽀持,连限制资源
都费劲。⽽ go 的运⾏环境⽐ java 简单多了,这意味着如果
出问题,go 搞出来的 app ⽐ java 少定位⼀个环节;另外,
制作 go 的 app 的容器镜像,要⽐ java 少⼀个 jre 的容量,
⽽且空载启动,占⽤的内存⼀般来说也要⽐ java 少。所以
说,不是 java 绝对写不了 k8s,⽽是 java 写的 k8s,不好维
护。

所以,最终从开发和维护⻆度权衡,go 是 k8s 的最优解;


⽽ k8s 和容器是分布式系统的最优解;分布式系统是⼤规模
服务器的最优解;⼤规模服务器是互联⽹⾏业发展的必然结
果。就这么简单。事实上,容器云在可预⻅的未来会是主
流,容器云的技术核⼼就是 k8s;⽽当下最适合以容器形式
部署在容器云上的语⾔,如果不考虑其他因素,⽐如招聘开
发者是否费劲,那毫⽆疑问是 go。

补充⼀下Go语⾔的来历:

当年那三位Google⼤⽜,为什么要创建
Go语⾔呢?
在2007的某⼀天,公司的⼏个⼤⽜,正在⽤ c + + 开发⼀些
⽐较繁琐但是核⼼的⼯作,主要包括庞⼤的分布式集群,⼤
⽜觉得很闹⼼,后来 c + +委员会来他们公司演讲,说 c + +
将要添加⼤概35种新特性。
这⼏个⼤⽜的其中⼀个⼈,名为:Rob Pike,听后⼼中⼀万
个xxx飘过,“ c + +特性还不够多吗?简化 c + +应该更有成
就感吧”。
于是乎,Rob Pike和其他⼏个⼤⽜讨论了⼀下,怎么解决这
个问题,过了⼀会,Rob Pike说要不我们⾃⼰搞个语⾔吧,
名字叫“go”,⾮常简短,容易拼写。
其他⼏位⼤⽜就说好啊,然后他们找了块⽩板,在上⾯写下
希望能有哪些功能(详⻅下⽂)。
接下来的时间⾥,⼤⽜们开⼼的讨论设计这⻔语⾔的特性,
经过漫⻓的岁⽉,他们决定,以c语⾔为原型,以及借鉴其
他语⾔的⼀些特性,来解放程序员,解放⾃⼰,然后在2009
年,go语⾔诞⽣。

⼤⽜们所罗列出的Go要有的功能:
规范的语法(不需要符号表来解析)
垃圾回收(独有)
⽆头⽂件
明确的依赖
⽆循环依赖
常量只能是数字
int和int32是两种类型
字⺟⼤⼩写设置可⻅性
任何类型(type)都有⽅法(不是类型)
没有⼦类型继承(不是⼦类)
包级别初始化以及明确的初始化顺序
⽂件被编译到⼀个包⾥
包package-level globals presented in any order
没有数值类型转换(常量起辅助作⽤)
接⼝隐式实现(没有“implement”声明)
嵌⼊(不会提升到超类)
⽅法按照函数声明(没有特别的位置要求)
⽅法即函数
接⼝只有⽅法(没有数据)
⽅法通过名字匹配(⽽⾮类型)
没有构造函数和析构函数
postincrement(如++i)是状态,不是表达式
没有preincrement(i++)和predecrement
赋值不是表达式
明确赋值和函数调⽤中的计算顺序(没有“sequence
point”)
没有指针运算
内存⼀直以零值初始化
局部变量取值合法
⽅法中没有“this”
分段的堆栈
没有静态和其它类型的注释
没有模板
内建string、slice和map
数组边界检查

再来看看Go语⾔的主要作者们:
肯•汤普逊(Ken
Thompson,http://en.wikipedia.org/wiki/Ken_Thompson
):设计了B语⾔和C语⾔,创建了Unix和Plan 9操作系
统,1983年图灵奖得主,Go的共同作者。
罗布•派克(Rob
Pike,http://en.wikipedia.org/wiki/Rob_Pike ):Unix⼩
组的成员,参与Plan 9和Inferno操作系统,参与 Limbo
和Go语⾔的研发。《UNIX编程环境》作者之⼀。
罗伯特•格⾥泽默(Robert Griesemer):曾协助制作
Java的HotSpot编译器和Chrome浏览器的JavaScript引
擎V8。
拉斯•考克斯(Russ Cox,http://swtch.com/~rsc/ ):
参与Plan 9操作系统的开发,Google Code Search项⽬
负责⼈。
伊安•泰勒(Ian Lance Taylor):GCC社区的活跃⼈
物。gold连接器和GCC过程间优化LTO的主要设计者,
Zembu公司的创始⼈。
布拉德•菲茨帕特⾥克(Brad
Fitzpatrick,http://en.wikipedia.org/wiki/Brad_Fitzpatric
k ):LiveJournal 的创始⼈,著名开源项⽬memcached
的作者。

You might also like