LZ最近从上家公司java转到go,工作内容还是主要业务逻辑代码,感觉go写起来不是很顺畅(oop思想可能根深蒂固了,语言熟练度也是一个原因),一个Orm框架用起来就特别麻烦。。。个人感觉基于go的特性还是做一些基础的伺服器组件会很有优势。。写一般的业务代码简直别扭。。没泛型、if err != nil等等.. 当然好处就是很多东西要自己实现,没有可靠的轮子。。。大家都用GO做什么呢


Go 的优点:实现快 + 资源占用低 + 任意环境随便跑,综合考虑在很多场景十分好使 。

  1. Go 适合造轮子,哪个库不好用就自己造。
  2. Go 适合写工具,比如 hugo 、hub、fzf,还有国人写的 linux 下的百度 pan client 都是 go 实现的。
  3. Go 适合实现 C/C++ 一部分业务,Java 的大部分业务。
  4. Go 适合做最外层的胶水,通过 RPC/REST/CGO 粘合不同语言的模块,而在这个胶水层还可以实现各种业务逻辑,又不用像 shell/py/node 有诸多顾虑和局限。

Go 提供了纤程、指针、 unsafe, cgo 加上 C/C++ 兼容的内存布局和跨平台的汇编,有了这些你能做的事情的上限基本就非常高了。

所以问题不是它适合做什么,是你有能力用它做什么。

在用 Go 写一个渲染器,因为学图形,需要一个应用框架来复现各类图形技术、论文和学习实践 PBRT 。

开始用 C++ 和 Go 同时写,主要实现是 C++,Go 只用来做架构探路,搞搞快速原型。

中间需要实现一个非同步消息框架,负责 GLFW 的 key event 和 window event 与图形逻辑、骨骼计算、camera 控制进行数据通讯,还要保证所有绘制 event 都在主线程做 draw call。这个功能用 Go 实现的逻辑 100 行不到,只用了3个特性:chan, init(),不定长参数。当初设计 + 查语法 + 写完 + 测试只花了大概 40 分钟,然后一直用到现在。

在做的过程中发现 Go 实现各种逻辑太方便了,而且基本上没啥干不了的,最后决定全部用 Go ,放弃 C++。

中间发现 Go 的标准库不支持 DDS 贴图,直接撸了个 Go 版的 DDS 库。大致就是看了下 wiki 了解了 DDS 格式,然后从 nv_dds 找到关键代码,逐行翻译成 Go 就搞定了,非常简单。

现在在写骨骼动画和 GUI, GUI 在参考一个日本人移植到 Go 的 nanovg 和 nanogui,非常有价值,他用 Go 实现了基于 OpenGL 的 draw api 还用 Go 搞定了 true type 字体的绘制。

因为需要管理大量模型的状态,打算用 orm + sqlite。但 gorm 的很多地方都不满意,也在考虑自己撸。

现在这个渲染器是这个程度:

Java 能写我的世界,C# 能写 Unity,Go 自然也能写游戏引擎,当然也能写其他更简单的系统,比如一些所谓「很复杂」的业务系统。

Go 不管写业务还是造轮子都很高效,既有高级语言特性,又能当更好的 C 用,构建部署也简单。

常规业务 Go 能被 C/C++ 碾压的主要就是瞬时的峰值内存,这个无解,但碾 Java 也没问题。

目前后端这块我没觉得什么是 Go 特别不适合干或者不能干的。

如果不用 Go,我估计也只会用 Rust,如果要写大量矩阵运算,泛型和操作符重载是仅有的我想要但 Go 没有的。

实际上用 Go 的很多也是多语言的牛人,比如 junegunn、spf13,都是背著几个几万 star 项目。

最后举几个比较偏但有意思的项目:

hunterloftis/pbr 一个 Go 写的基于物理渲染的光追渲染器

fogleman/pt 另一个光追渲染器

shibukawa/nanovgo 日本人移植的 Go 版的 nanovg,基于 OpenGL 实现了画框、画线、画字的 Go API,相当于原来 Windows 上的 Direct Draw

shibukawa/nanogui-go 上面那位作者移植的 Go 版的 nanogui,基于他移植的 nanovgo 实现的 GUI 库

Shopify/go-lua Go 实现的 lua 5.2 VM

wooga/go-entitas 一个非常精简的 ECS 实现

最后说一句,这个世界上有太多有意思的问题和领域值得学习和探索。

语言最终是用来表达你思想和思维的,只要能帮你快速解决问题达到目标,对你而言就是好语言。


GO语言的发展与现状

发展历史

2007年9月,Rob Pike在Google分散式编译平台上进行C++编译,在漫长的等待过程中,他和Robert Griesemer探讨了程序设计语言的一些关键性问题,他们认为,简化编程语言相比于在臃肿的语言上不断增加新特性,会是更大的进步。随后他们在编译结束之前说服了身边的Ken Thompson,觉得有必要为此做一些事情。几天后,他们发起了一个叫Golang的项目,将它作为自由时间的实验项目。

2008年5月 Google发现了GO语言的巨大潜力,得到了Google的全力支持,这些人开始全职投入GO语言的设计和开发。

2009年11月 GO语言第一个版本发布。2012年3月 第一个正式版本Go1.0发布。

2015年8月 go1.5发布,这个版本被认为是历史性的。完全移除C语言部分,使用GO编译GO,少量代码使用汇编实现。另外,他们请来了内存管理方面的权威专家Rick Hudson,对GC进行了重新设计,支持并发GC,解决了一直以来广为诟病的GC时延(STW)问题。并且在此后的版本中,又对GC做了更进一步的优化。到go1.8时,相同业务场景下的GC时延已经可以从go1.1的数秒,控制在1ms以内。GC问题的解决,可以说GO语言在服务端开发方面,几乎抹平了所有的弱点。

在GO语言的版本迭代过程中,语言特性基本上没有太大的变化,基本上维持在GO1.1的基准上,并且官方承诺,新版本对老版本下开发的代码完全兼容。事实上,GO开发团队在新增语言特性上显得非常谨慎,而在稳定性、编译速度、执行效率以及GC性能等方面进行了持续不断的优化。

开发团队

GO语言的开发阵营可以说是空前强大,主要成员中不乏计算机软体界的历史性人物,对计算机软体的发展影响深远。Ken Thompson,来自贝尔实验室,设计了B语言,创立了Unix操作系统(最初使用B语言实现),随后在Unix开发过程中,又和Dennis Ritchie一同设计了C语言,继而使用C语言重构了Unix操作系统。Dennis Ritchie和Ken Thompson被称为Unix和C语言之父,并在1983年共同被授以图灵奖,以表彰他们对计算机软体发展所作的杰出贡献。Rob Pike,同样来自贝尔实验室,Unix小组重要成员,发明了Limbo语言,并且和Ken Thompson共同设计了UTF-8编码,《Unix编程环境》、《编程实践》作者之一。

可以说,GO语言背靠Google这棵大树,又不乏牛人坐镇,是名副其实的「牛二代」。

大名鼎鼎的Docker,完全用GO实现,业界最为火爆的容器编排管理系统kubernetes,完全用GO实现,之后的Docker Swarm,完全用GO实现。除此之外,还有各种有名的项目如etcd/consul/flannel等等,均使用GO实现。有人说,GO语言之所以出名,是赶上了云时代,但为什么不能换种说法,也是GO语言促使了云的发展?

除了云项目外,还有像今日头条、UBER这样的公司,他们也使用GO语言对自己的业务进行了彻底的重构。

GO语言关键特性

GO语言之所以厉害,是因为它在服务端的开发中,总能抓住程序员的痛点,以最直接、简单、高效、稳定的方式来解决问题。这里我们并不会深入讨论GO语言的具体语法,只会将语言中关键的、对简化编程具有重要意义的方面介绍给大家,跟随大师们的脚步,体验GO的设计哲学。

GO语言的关键特性主要包括以下几方面:

  • 并发与协程
  • 基于消息传递的通信方式
  • 丰富实用的内置数据类型
  • 函数多返回值
  • defer机制
  • 反射(reflect)
  • 高性能HTTP Server
  • 工程管理
  • 编程规范

在当今这个多核时代,并发编程的意义不言而喻。当然,很多语言都支持多线程、多进程编程,但遗憾的是,实现和控制起来并不是那么令人感觉轻松和愉悦。Golang不同的是,语言级别支持协程(goroutine)并发(协程又称微线程,比线程更轻量、开销更小,性能更高),操作起来非常简单,语言级别提供关键字(go)用于启动协程,并且在同一台机器上可以启动成千上万个协程。

对比JAVA的多线程和GO的协程实现,明显更直接、简单。这就是GO的魅力所在,以简单、高效的方式解决问题,关键字go,或许就是GO语言最重要的标志。

基于消息传递的通信方式

在非同步的并发编程过程中,只能方便、快速的启动协程还不够。协程之间的消息通信,也是非常重要的一环,否则,各个协程就会成为脱缰的野马而无法控制。在GO语言中,使用基于消息传递的通信方式(而不是大多数语言所使用的基于共享内存的通信方式)进行协程间通信,并且将消息管道(channel)作为基本的数据类型,使用类型关键字(chan)进行定义,并发操作时线程安全。这点在语言的实现上,也具有革命性。可见,GO语言本身并非简单得没有底线,恰恰他们会将最实用、最有利于解决问题的能力,以最简单、直接的形式提供给用户。

Channel并不仅仅只是用于简单的消息通信,还可以引申出很多非常实用,而实现起来又非常方便的功能。比如,实现TCP连接池、限流等等,而这些在其它语言中实现起来并不轻松,但GO语言可以轻易做到。

GO语言作为编译型语言,在数据类型上也支持得非常全面,除了传统的整型、浮点型、字元型、数组、结构等类型外。从实用性上考虑,也对字元串类型、切片类型(可变长数组)、字典类型、复数类型、错误类型、管道类型、甚至任意类型(Interface{})进行了原生支持,并且用起来非常方便。比如字元串、切片类型,操作简便性几乎和python类似。

另外,将错误类型(error)作为基本的数据类型,并且在语言级别不再支持try…catch的用法,这应该算是一个非常大胆的革命性创举,也难怪很多人吐槽GO语言不伦不类。但是跳出传统的观念,GO的开发者认为在编程过程中,要保证程序的健壮性和稳定性,对异常的精确化处理是非常重要的,只有在每一个逻辑处理完成后,明确的告知上层调用,是否有异常,并由上层调用明确、及时的对异常进行处理,这样才可以高程度的保证程序的健壮性和稳定性。虽然这样做会在编程过程中出现大量的对error结果的判断,但是这无疑也增强了开发者对异常处理的警惕度。而实践证明,只要严格按GO推荐的风格编码,想写出不健壮的代码,都很难。当然,前提是你不排斥它,认可它。

在语言中支持函数多返回值,并不是什么新鲜事,Python就是其中之一。允许函数返回多个值,在某些场景下,可以有效的简化编程。GO语言推荐的编程风格,是函数返回的最后一个参数为error类型(只要逻辑体中可能出现异常),这样,在语言级别支持多返回值,就很有必要了。

Defer延迟处理机制

在GO语言中,提供关键字defer,可以通过该关键字指定需要延迟执行的逻辑体,即在函数体return前或出现panic时执行。这种机制非常适合善后逻辑处理,比如可以尽早避免可能出现的资源泄漏问题。

可以说,defer是继goroutine和channel之后的另一个非常重要、实用的语言特性,对defer的引入,在很大程度上可以简化编程,并且在语言描述上显得更为自然,极大的增强了代码的可读性。

Golang作为强类型的编译型语言,灵活性上自然不如解析型语言。比如像PHP,弱类型,并且可以直接对一个字元串变数的内容进行new操作,而在编译型语言中,这显然不太可能。但是,Golang提供了Any类型(interface{})和强大的类型反射(reflect)能力,二者相结合,开发的灵活性上已经很接近解析型语言。在逻辑的动态调用方面,实现起来仍然非常简单。既然如此,那么像PHP这种解析型语言相比于GO,优势在那里呢?就我个人而言,写了近10年的PHP,实现过开发框架、基础类库以及各种公共组件,虽然执行性能不足,但是开发效率有余;而当遇上Golang,这些优势似乎不那么明显了。

作为出现在互联网时代的服务端语言,面向用户服务的能力必不可少。GO在语言级别自带HTTP/TCP/UDP高性能伺服器,基于协程并发,为业务开发提供最直接有效的能力支持。要在GO语言中实现一个高性能的HTTP Server,只需要几行代码即可完成,非常简单。

在GO语言中,有一套标准的工程管理规范,只要按照这个规范进行项目开发,之后的事情(比如包管理、编译等等)都将变得非常的简单。

在GO项目下,存在两个关键目录,一个是src目录,用于存放所有的.go源码文件;一个是bin目录,用于存在编译后的二进位文件。在src目录下,除了main主包所在的目录外,其它所有的目录名称与直接目录下所对应的包名保持对应,否则编译无法通过。这样,GO编译器就可以从main包所在的目录开始,完全使用目录结构和包名来推导工程结构以及构建顺序,避免像C++一样,引入一个额外的Makefile文件。

在GO的编译过程中,我们唯一要做的就是将GO项目路径赋值给一个叫GOPATH的环境变数,让编译器知道将要编译的GO项目所在的位置。然后进入bin目录下,执行go build {主包所在的目录名},即可秒级完成工程编译。编译后的二进位文件,可以推到同类OS上直接运行,没有任何环境依赖。

GO语言的编程规范强制集成在语言中,比如明确规定花括弧摆放位置,强制要求一行一句,不允许导入没有使用的包,不允许定义没有使用的变数,提供gofmt工具强制格式化代码等等。奇怪的是,这些也引起了很多程序员的不满,有人发表GO语言的XX条罪状,里面就不乏对编程规范的指责。要知道,从工程管理的角度,任何一个开发团队都会对特定语言制定特定的编程规范,特别像Google这样的公司,更是如此。GO的设计者们认为,与其将规范写在文档里,还不如强制集成在语言里,这样更直接,更有利用团队协作和工程管理。

API快速开发框架实践

编程语言是一个工具,它会告诉我们能做什么,而怎么做会更好,同样值得去探讨。这部分会介绍用GO语言实现的一个开发框架,以及几个公共组件。当然,框架和公共组件,其它语言也完全可以实现,而这里所关注的是成本问题。除此之外,抛开GO语言本身不说,我们也希望可以让大家从介绍的几个组件中,得到一些解决问题的思路,那就是通过某种方式,去解决一个面上的问题,而非一味的写代码,最终却只是解决点上的问题。如果你认可这种方式,相信下面的内容也许会影响你之后的项目开发方式,从根本上提高开发效率。

我们为什么选择GO语言

选择GO语言,主要是基于两方面的考虑

  1. 执行性能 缩短API的响应时长,解决批量请求访问超时的问题。在Uwork的业务场景下,一次API批量请求,往往会涉及对另外介面服务的多次调用,而在之前的PHP实现模式下,要做到并行调用是非常困难的,串列处理却不能从根本上提高处理性能。而GO语言不一样,通过协程可以方便的实现API的并行处理,达到处理效率的最大化。 依赖Golang的高性能HTTP Server,提升系统吞吐能力,由PHP的数百级别提升到数千里甚至过万级别。
  2. 开发效率 GO语言使用起来简单、代码描述效率高、编码规范统一、上手快。 通过少量的代码,即可实现框架的标准化,并以统一的规范快速构建API业务逻辑。 能快速的构建各种通用组件和公共类库,进一步提升开发效率,实现特定场景下的功能量产。

很多人在学习一门新语言或开启一个新项目时,都会习惯性的是网上找一个认为合适的开源框架来开始自己的项目开发之旅。这样并没有什么不好,但是个人觉得,了解它内部的实现对我们会更有帮助。或许大家已经注意到了,所说的MVC框架,其本质上就是对请求路径进行解析,然后根据请求路径段,路由到相应的控制器(C)上,再由控制器进一步调用数据逻辑(M),拿到数据后,渲染视图(V),返回用户。在整个过程中,核心点在于逻辑的动态调用。

不过,对API框架的实现相对于WEB页面框架的实现,会更简单,因为它并不涉及视图的渲染,只需要将数据结果以协议的方式返回给用户即可。

使用GO语言实现一套完整的MVC开发框架,是非常容易的,集成HTTP Server的同时,整个框架的核心代码不会超过300行,从这里可以实际感受到GO的语言描述效率之高(如果有兴趣,可以参考Uwork开源项目seine)。

也有人说,在GO语言中,就没有框架可言,言外之意是说,引入一个重型的开源框架,必要性并不大,相反还可能把简单的东西复杂化。

在实际项目开发过程中,只有高效的开发语言还不够,要想进一步将开发效率扩大化,不断的沉淀公共基础库是必不可少的,以便将通用的基础逻辑进一步抽象和复用。

除此之外,通用组件能力是实现功能量产的根本,对开发效率会是质的提升。组件化的开发模式会帮忙我们将问题的解决能力从一个点上提升到一个面上。以下会重点介绍几个通用组件的实现,有了它们的存在,才能真正的解放程序员的生产力。而这些强有力的公共组件在Golang中实现起来并不复杂。同时,结合Golang的并发处理能力,相比于PHP的版本实现,执行效率也会有质的提升。这是组件能力和语言效率的完美结合。

通用列表组件用于所有可能的二维数据源(如MySQL/MongoDB/ES等等)的数据查询场景,从一个面上解决了数据查询问题。在Uwork项目开发中,被大量使用,实现数据查询介面和页面查询列表的量产开发。它以一个JSON配置文件为中心,来实现对通用数据源的查询,并将查询结果以API或页面的形式自动返回给用户。整个过程中几乎没有代码开发,而唯一要做的只是以一种统一的规范编写配置文件(而不是代码),真正实现了对数据查询需求的功能量产。

以上是通用列表组件的构建过程,要实现这样一个功能强大的通用组件,是不是会给人一种可望而不可及的感觉?其实并非如此,只要理清了它的整个过程,将构建思路融入Golang中,并不是一件复杂的事情。在我们的项目中,整个组件的实现,只用了不到700行Go代码,就解决了一系列的数据查询问题。另外,通过Golang的并发特性,实现栏位处理器的并行执行,进一步的提高了组件的执行效率。可以说,通用列表和Golang的融合,是性能和效率的完美结合。

通用表单组件主要用于对资料库的增、删、改场景。该组件在Uwork的项目开发中,也有广泛的应用,与通用列表类似,以一个JSON配置文件为中心,来完成对数据表数据的增、删、改操作。特别是近期完成的部件级SDB管理平台,通过通用表单实现了对整个系统的数据维护,通过高度抽象化,做到了业务的无代码化生产。

以上是通用表单的完整构建过程,而对于这个一个组件的实现,我们用了不到1000行的GO代码,就解决了对数据表数据维护整个面上的问题。

GO语言本身支持协程并发,协程非常轻量,可以快速启动成千上万个协程工作单元。如果对协程任务的数量控制不当,最后的结果很可能适得其反,从而对外部或本身的服务造成不必要的压力。协程池可以在一定程度上控制执行单元的数量,保证执行的安全性。而在Golang中要实现这样一个协程池,是非常简单的,只需要对channel和goroutine稍加封装,就可以完成,整个构建过程不到80行代码。

在API开发过程中,数据校验永远是必不可或缺的一个环节。如果只是简单的数据校验,几行代码也许就完成了,可是当遇上复杂的数据校验时,很可能几百行的代码量也未必能完成,特别是遇到递归类型的数据校验,那简直就是一个噩梦。

数据校验组件,可以通过一种数据模板的配置方式,使用特定的逻辑来完成通用校验,开发者只需要配置好相应的数据模板,进行简单的调用,即可完成整个校验过程。而对于这样一个通用性的数据校验组件,在GO语言中只用了不到700行的代码量就完成了整个构建。

小结

在实际项目开发过程中,对开发效率提升最大的,无疑是符合系统业务场景的公共组件能力,这点也正好应证了Rob Pike那句话(Less is lessor Less is more),真正的高效率开发,是配置化的,并不需要写太多的代码,甚至根本就不需要写代码,即可完成逻辑实现,而这种方式对于后期的维护成本也是最优的,因为做到了高度的统一。

GO的语言描述效率毋庸置疑,对上述所有公共组件的实现,均未超过1000行代码,就解决了某个面上的问题。

搜索关注公众号「云加社区」,第一时间获取技术干货,关注后回复1024 送你一份技术课程大礼包!

编辑于 2018-11-26继续浏览内容知乎发现更大的世界打开Chrome继续茹姐茹姐Go/Java/Python B站:rubyhan1314

鉴于Go语言的特点和设计的初衷,Go语言作为伺服器编程语言,很适合处理日志、数据打包、虚拟机处理、文件系统、分散式系统、资料库代理等;网路编程方面,Go语言广泛应用于Web 应用、API应用、下载应用等;除此之外,Go语言还适用于内存资料库和云平台领域,目前国外很多云平台都是采用Go开发。

  • 伺服器编程,以前你如果使用C或者C++做的那些事情,用Go来做很合适,例如处理日志、数据打包、虚拟机处理、文件系统等。
  • 分散式系统、资料库代理器、中间件等,例如Etcd。
  • 网路编程,这一块目前应用最广,包括Web应用、API应用、下载应用,而且Go内置的net/http包基本上把我们平常用到的网路功能都实现了。
  • 资料库操作
  • 开发云平台,目前国外很多云平台在采用Go开发

Go发布之后,很多公司特别是云计算公司开始用Go重构他们的基础架构,很多都是直接采用Go进行了开发,最近热火朝天的Docker就是采用Go开发的。

使用 Go 语言开发的开源项目非常多。早期的 Go 语言开源项目只是通过 Go 语言与传统项目进行C语言库绑定实现,例如 Qt、Sqlite 等;后期的很多项目都使用 Go 语言进行重新原生实现,这个过程相对于其他语言要简单一些,这也促成了大量使用 Go 语言原生开发项目的出现。

  • 云计算基础设施领域代表项目:docker、kubernetes、etcd、consul、cloudflare CDN、七牛云存储等。
  • 基础软体代表项目:tidb、influxdb、cockroachdb等。
  • 微服务代表项目:go-kit、micro、monzo bank的typhon、bilibili等。
  • 互联网基础设施代表项目:以太坊、hyperledger等。

………………………………………………………于2019.4.22日更…………………………………………………

国内外有哪些企业或项目使用Go语言

Docker

Docker 是一种操作系统层面的虚拟化技术,可以在操作系统和应用程序之间进行隔离,也可以称之为容器。Docker 可以在一台物理伺服器上快速运行一个或多个实例。基于lxc的一个虚拟打包工具,能够实现PAAS平台的组建。例如,启动一个 CentOS 操作系统,并在其内部命令行执行指令后结束,整个过程就像自己在操作系统一样高效。

项目链接:

https://github.com/docker/docker?

github.com

go语言

Go 语言自己的早期源码使用C语言和汇编语言写成。从 Go 1.5 版本后,完全使用 Go 语言自身进行编写。Go 语言的源码对了解 Go 语言的底层调度有极大的参考意义,建议希望对 Go 语言有深入了解的读者读一读。

项目链接:

golang/go?

github.com图标

Kubernetes

Google 公司开发的构建于 Docker 之上的容器调度服务,用户可以通过 Kubernetes 集群进行云端容器集群管理。

项目链接:

kubernetes/kubernetes?

github.com图标

etcd

一款分散式、可靠的 KV 存储系统,可以快速进行云配置。

项目链接:

etcd-io/etcd?

github.com图标

beego

beego 是一个类似 Python的 Tornado 框架,采用了 RESTFul 的设计思路,使用 Go 语言编写的一个极轻量级、高可伸缩性和高性能的 Web 应用框架。

项目链接:

astaxie/beego?

github.com图标

martini

一款快速构建模块化的 Web 应用的 Web 框架。

项目链接:

go-martini/martini?

github.com图标

codis

国产的优秀分散式 Redis 解决方案。

项目链接:

https://github.com/CodisLabs/codis?

github.com

delve

Go语言

强大的调试器,被很多集成环境和编辑器整合。

项目链接:

go-delve/delve?

github.com图标

Facebook

Facebook也在用,为此他们还专门在Github上建立了一个开源组织facebookgo,大家可以通过

Facebook Go?

github.com图标

访问查看facebook开源的项目,比如著名的是平滑升级的grace。

Uber

腾讯

腾讯作为国内的大公司,还是敢于尝试的,尤其是Docker容器化这一块,他们在15年已经做了docker万台规模的实践,具体可以参考

腾讯万台规模的Docker应用实践 - InfoQ?

www.infoq.com

百度

目前所知的百度的使用是在运维这边,是百度运维的一个BFE项目,负责前端流量的接入。他们的负责人在2016年有分享,大家可以看下这个 。

InfoQ - 促进软体开发领域知识与创新的传播?

www.infoq.com

其次就是百度的消息系统。负责公司手百消息通讯系统伺服器端开发及维护。

京东

京东云消息推送系统、云存储,以及京东商城等都有使用Go做开发。

小米

小米对Golang的支持,莫过于运维监控系统的开源,也就是

http://open-falcon.com/?

open-falcon.com

此外,小米互娱、小米商城、小米视频、小米生态链等团队都在使用Golang。

360

360对Golang的使用也不少,一个是开源的日志搜索系统Poseidon,托管在Github上,

Qihoo360/poseidon?

github.com图标

还有360的推送团队也在使用,他们还写了篇博文在Golang的官方博客上。

https://blog.golang.org/qihoo?

blog.golang.org

七牛云

七牛云用了近50万行代码,来实现整个产品。七牛云存储产品网址:

七牛云 - 国内领先的企业级云服务商?

qiniu.com图标

上线时间:2011-9-1。应用范围:整个产品(包括基础服务、Web端、统计平台、各类小工具等等)Go代码行数占比:99.9%日 PV:保密

美团

美团后台流量支撑程序。应用范围:支撑主站后台流量(排序,推荐,搜索等),提供负载均衡,cache,容错,按条件分流,统计运行指标(qps,latency)等功能。

滴滴

基础服务平台。

金山微看

应用范围:服务介面,后台流程服务,消息系统,图片系统

搜狗

搜狗推送系统。Push系统中用于维持与客户端连接的部分。

QOR - 模块化的电商系统

  • QOR官网:

QOR: E-commerce CMS SDK written in Go?

getqor.com

  • github地址: qor/qor · GitHub
  • 应用范围: 整个产品

weico

产品名:weico 3.0, 服务端所有代码都是用Go实现。

仙侠道

  • 产品网址:

仙侠道官网 - 心动游戏?

www.zhihu.com图标

  • 应用范围: 游戏服务端(通讯、逻辑、数据存储)

快玩游戏

  • 网址:

快玩小游戏,单机游戏,网页游戏,快玩游戏,快玩游戏盒?

www.zhihu.com图标

  • 应用范围:实时消息系统、用户认证、用户会话、统一统计介面

盛大云CDN

  • 网址:盛大云计算
  • 应用范围:CDN的调度系统、分发系统、监控系统、短域名服务,CDN内部开放平台、运营报表系统以及其他一些小工具等

Bmob移动后端云服务平台

  • 产品网址:Bmob移动后端云服务平台
  • 应用范围:Restful API(使用Beego)、统计分析平台、常用服务如发邮件、队列非同步处理、统计用户空间和介面请求

群策

  • 网址:

群策 - 统一团队沟通,高效完成工作?

www.zhihu.com图标

  • 应用范围:全系统

BiddingX DSP广告投放系统

  • 网址:BiddingX_专业的DSP解决方案供应商
  • 应用范围:竞价投放、曝光统计、点击跳转

街坊四邻

  • 网址:首页 - 街坊四邻
  • 应用范围:后台服务

Leanote

  • 网址:Leanote

Bearychat

  • 网址:BearyChat

宅豆

  • 网址:宅豆网 - 自筑最美家,宅豆随你搭

白板- 设计图讨论工具

  • 网址:白板

实验楼

  • 网址:实验楼 - 第一家以实验为核心的IT在线教育平台

新浪微博

中间件和弹性调度用 Java 和 Go 编写,微博视频转码及存储服务用 Go 编写。

爱奇艺

VR 后台系统中间件,VR 端的 HTTP 介面。

猎豹移动

消息推送

网易

网易蜂巢容器公有云。

哔哩哔哩

弹幕

巨人网路

部分手机游戏的服务端。

今日头条

Nsq:Nsq 是由Go语言开发的高性能、高可用消息队列系统,性能非常高,每天能处理数十亿条的消息;

Packer:用来生成不同平台的镜像文件,例如VM、vbox、AWS等,作者是vagrant的作者

Skynet:分散式调度框架

Doozer:分散式同步工具,类似ZooKeeper

Heka:mazila开源的日志处理系统

Cbfs:couchbase开源的分散式文件系统

Tsuru:开源的PAAS平台,和SAE实现的功能一模一样

Groupcache:memcahe作者写的用于Google下载系统的缓存系统

God:类似redis的缓存系统,但是支持分散式和扩展性

Gor:网路流量抓包和重放工具

还有很多,比如阿里中间件、聚美优品、高升控股、探探、斗鱼直播、人人车、亚信、Udesk、方付通、招财猫、三一集团、美餐网等。一般的选择,都是选择用于自己公司合适的产品系统来做,比如消息推送的、监控的、容器的等,Golang特别适合做网路并发的服务,这是他的强项,所以也是被优先用于这些项目。Go语言作为一门大型项目开发语言,在很多大公司相继使用,甚至完全转向Go开发。

……………………………………………………更于2019.4.23日………………………………………………

当然,一个技术能不能发展起来,关键还要看三点。

1、有没有一个比较好的社区。

像 C、C++、Java、Python 和 JavaScript 的生态圈都是非常丰富和火爆的。尤其是有很多商业机构参与的社区那就更为人气爆棚了,比如 Linux 的社区。

2、有没有一个工业化的标准。

像 C、C++、Java 都是有标准化组织的。尤其是 Java,其在架构上还搞出了像 J2EE 这样的企业级标准。

3、有没有一个或多个杀手级应用。

C、C++ 和 Java 的杀手级应用不用多说了,就算是对于 PHP 这样还不能算是一个好的编程语言来说,因为是 Linux 时代的第一个杀手级解决方案 LAMP 中的关键技术,所以,也发展起来了。

上述的这三点是非常关键的,新的技术只需要占到其中一到两点就已经很不错了,何况有的技术,比如 Java,是三点全占到了,所以,Java 的发展是如此好。当然,除了上面这三点重要的,还有一些其它的影响因素,比如:

  • 学习曲线是否低,上手是否快。这点非常重要,C++ 在这点上越做越不好了。
  • 有没有一个不错的提高开发效率的开发框架。如:Java 的 Spring 框架,C++ 的 STL 等。
  • 是否有一个或多个巨型的技术公司作为后盾。如:Java 和 Linux 后面的 IBM、Sun……
  • 有没有解决软体开发中的痛点。如:Java 解决了 C 和 C++ 的内存管理问题。

用这些标尺来量一下 Go 语言,我们可以清楚地看到:

  • Go 语言容易上手;
  • Go 语言解决了并发编程和写底层应用开发效率的痛点;
  • Go 语言有 Google 这个世界一流的技术公司在后面;
  • Go 语言的杀手级应用是 Docker,而 Docker 的生态圈在这几年完全爆棚了。

所以,Go 语言的未来是不可限量的。当然,我个人觉得,Go 可能会吞食很多 C、C++、Java 的项目。不过,Go 语言所吞食主要的项目应该是中间层的项目,既不是非常底层也不会是业务层。

也就是说,Go 语言不会吞食底层到 C 和 C++ 那个级别的,也不会吞食到高层如 Java 业务层的项目。Go 语言能吞食的一定是 PaaS 上的项目,比如一些消息缓存中间件、服务发现、服务代理、控制系统、Agent、日志收集等等,没有复杂的业务场景,也到不了特别底层(如操作系统)的中间平台层的软体项目或工具。而 C 和 C++ 会被打到更底层,Java 会被打到更上层的业务层。

好了,我们再用上面的标尺来量一下 Go 语言的杀手级应用 Docker,你会发现基本是一样的。

  • Docker 上手很容易。
  • Docker 解决了运维中的环境问题以及服务调度的痛点。
  • Docker 的生态圈中有大公司在后面助力。比如 Google。
  • Docker 产出了工业界标准 OCI。
  • Docker 的社区和生态圈已经出现像 Java 和 Linux 那样的态势。
  • ……

所以,虽然几年前的 Docker ,当时的坑儿还很多,但是,相对于这些大的因素来说,那些小坑儿都不是问题。只是需要一些时间,这些小坑儿在未来 5-10 年就可以完全被填平了。

同样,我们可以看到 Kubernetes 作为服务和容器调度的关键技术一定会是最后的赢家。


最后,我还要说一下,为什么要早一点地进入这些新技术,而不是等待这些技术成熟了后再进入。原因有这么几个。

技术的发展过程非常重要。因为你可以清楚地看到了这种新技术的生态圈发展过程。让我们收获最大的并不是这些技术本身,而是一个技术的变迁和行业的发展。

从中,我们看到了非常具体的各种思潮和思路,这些东西比起 技术本身来说更有价值。因为,这不但让我们重新思考已经掌握的技术以及如何更好地解决已有的问题,而且还让我看到了未来。不但有了技术优势,而且这些知识还让我们的技术生涯多了很多的可能性。

这些关键新技术,可以让你拿到技术的先机。这些对一个需要技术领导力的个人或公司来说都是非常重要的。

一个公司或是个人能够占有技术先机,就会比其它公司或个人有更大的影响力。一旦未来行业需求引爆,那么这个公司或是个人的影响力就会形成一个比较大的护城河,并可以快速地产生经济利益。

Go的应用范围一直在扩大,云计算,微服务,区块链,哪里都有用Go写的重量级项目。docker/kubernetes生态圈,几百/千万行代码,基本统治了云原生应用市场。去年大热的区块链,以太坊的geth,比特币的btcd,闪电网路的lnd,都是Go语言开发。

还是那句话,多看看各种语言的生态,或许都并没有你想像的那么不堪。。。Go语言设计上确实不够「先进」,但也是另一种「务实」。其实go不管在国内还是国外已经很受待见了,国外google用的很多,uber也在用,国内有著名的今日头条,每日千亿级的访问妥妥的。多少语言终其一生都没有这么大的应用场景。


鉴于Go语言的特点和设计的初衷,Go语言作为伺服器编程语言,很适合处理日志、数据打包、虚拟机处理、文件系统、分散式系统、资料库代理等;网路编程方面,Go语言广泛应用于Web 应用、API应用、下载应用等;除此之外,Go语言还适用于内存资料库和云平台领域,目前国外很多云平台都是采用Go开发。

  • 伺服器编程,以前你如果使用C或者C++做的那些事情,用Go来做很合适,例如处理日志、数据打包、虚拟机处理、文件系统等。
  • 分散式系统、资料库代理器、中间件等,例如Etcd。
  • 网路编程,这一块目前应用最广,包括Web应用、API应用、下载应用,而且Go内置的net/http包基本上把我们平常用到的网路功能都实现了。
  • 资料库操作
  • 开发云平台,目前国外很多云平台在采用Go开发

Go发布之后,很多公司特别是云计算公司开始用Go重构他们的基础架构,很多都是直接采用Go进行了开发,最近热火朝天的Docker就是采用Go开发的。

使用 Go 语言开发的开源项目非常多。早期的 Go 语言开源项目只是通过 Go 语言与传统项目进行C语言库绑定实现,例如 Qt、Sqlite 等;后期的很多项目都使用 Go 语言进行重新原生实现,这个过程相对于其他语言要简单一些,这也促成了大量使用 Go 语言原生开发项目的出现。

  • 云计算基础设施领域代表项目:docker、kubernetes、etcd、consul、cloudflare CDN、七牛云存储等。
  • 基础软体代表项目:tidb、influxdb、cockroachdb等。
  • 微服务代表项目:go-kit、micro、monzo bank的typhon、bilibili等。
  • 互联网基础设施代表项目:以太坊、hyperledger等。

………………………………………………………于2019.4.22日更…………………………………………………

国内外有哪些企业或项目使用Go语言

Docker

Docker 是一种操作系统层面的虚拟化技术,可以在操作系统和应用程序之间进行隔离,也可以称之为容器。Docker 可以在一台物理伺服器上快速运行一个或多个实例。基于lxc的一个虚拟打包工具,能够实现PAAS平台的组建。例如,启动一个 CentOS 操作系统,并在其内部命令行执行指令后结束,整个过程就像自己在操作系统一样高效。

项目链接:

https://github.com/docker/docker?

github.com

go语言

Go 语言自己的早期源码使用C语言和汇编语言写成。从 Go 1.5 版本后,完全使用 Go 语言自身进行编写。Go 语言的源码对了解 Go 语言的底层调度有极大的参考意义,建议希望对 Go 语言有深入了解的读者读一读。

项目链接:

golang/go?

github.com图标

Kubernetes

Google 公司开发的构建于 Docker 之上的容器调度服务,用户可以通过 Kubernetes 集群进行云端容器集群管理。

项目链接:

kubernetes/kubernetes?

github.com图标

etcd

一款分散式、可靠的 KV 存储系统,可以快速进行云配置。

项目链接:

etcd-io/etcd?

github.com图标

beego

beego 是一个类似 Python的 Tornado 框架,采用了 RESTFul 的设计思路,使用 Go 语言编写的一个极轻量级、高可伸缩性和高性能的 Web 应用框架。

项目链接:

astaxie/beego?

github.com图标

martini

一款快速构建模块化的 Web 应用的 Web 框架。

项目链接:

go-martini/martini?

github.com图标

codis

国产的优秀分散式 Redis 解决方案。

项目链接:

https://github.com/CodisLabs/codis?

github.com

delve

Go语言

强大的调试器,被很多集成环境和编辑器整合。

项目链接:

go-delve/delve?

github.com图标

Facebook

Facebook也在用,为此他们还专门在Github上建立了一个开源组织facebookgo,大家可以通过

Facebook Go?

github.com图标

访问查看facebook开源的项目,比如著名的是平滑升级的grace。

Uber

腾讯

腾讯作为国内的大公司,还是敢于尝试的,尤其是Docker容器化这一块,他们在15年已经做了docker万台规模的实践,具体可以参考

腾讯万台规模的Docker应用实践 - InfoQ?

www.infoq.com

百度

目前所知的百度的使用是在运维这边,是百度运维的一个BFE项目,负责前端流量的接入。他们的负责人在2016年有分享,大家可以看下这个 。

InfoQ - 促进软体开发领域知识与创新的传播?

www.infoq.com

其次就是百度的消息系统。负责公司手百消息通讯系统伺服器端开发及维护。

京东

京东云消息推送系统、云存储,以及京东商城等都有使用Go做开发。

小米

小米对Golang的支持,莫过于运维监控系统的开源,也就是

http://open-falcon.com/?

open-falcon.com

此外,小米互娱、小米商城、小米视频、小米生态链等团队都在使用Golang。

360

360对Golang的使用也不少,一个是开源的日志搜索系统Poseidon,托管在Github上,

Qihoo360/poseidon?

github.com图标

还有360的推送团队也在使用,他们还写了篇博文在Golang的官方博客上。

https://blog.golang.org/qihoo?

blog.golang.org

七牛云

七牛云用了近50万行代码,来实现整个产品。七牛云存储产品网址:

七牛云 - 国内领先的企业级云服务商?

qiniu.com图标

上线时间:2011-9-1。应用范围:整个产品(包括基础服务、Web端、统计平台、各类小工具等等)Go代码行数占比:99.9%日 PV:保密

美团

美团后台流量支撑程序。应用范围:支撑主站后台流量(排序,推荐,搜索等),提供负载均衡,cache,容错,按条件分流,统计运行指标(qps,latency)等功能。

滴滴

基础服务平台。

金山微看

应用范围:服务介面,后台流程服务,消息系统,图片系统

搜狗

搜狗推送系统。Push系统中用于维持与客户端连接的部分。

QOR - 模块化的电商系统

  • QOR官网:

QOR: E-commerce CMS SDK written in Go?

getqor.com

  • github地址: qor/qor · GitHub
  • 应用范围: 整个产品

weico

产品名:weico 3.0, 服务端所有代码都是用Go实现。

仙侠道

  • 产品网址:

仙侠道官网 - 心动游戏?

www.zhihu.com图标

  • 应用范围: 游戏服务端(通讯、逻辑、数据存储)

快玩游戏

  • 网址:

快玩小游戏,单机游戏,网页游戏,快玩游戏,快玩游戏盒?

www.zhihu.com图标

  • 应用范围:实时消息系统、用户认证、用户会话、统一统计介面

盛大云CDN

  • 网址:盛大云计算
  • 应用范围:CDN的调度系统、分发系统、监控系统、短域名服务,CDN内部开放平台、运营报表系统以及其他一些小工具等

Bmob移动后端云服务平台

  • 产品网址:Bmob移动后端云服务平台
  • 应用范围:Restful API(使用Beego)、统计分析平台、常用服务如发邮件、队列非同步处理、统计用户空间和介面请求

群策

  • 网址:

群策 - 统一团队沟通,高效完成工作?

www.zhihu.com图标

  • 应用范围:全系统

BiddingX DSP广告投放系统

  • 网址:BiddingX_专业的DSP解决方案供应商
  • 应用范围:竞价投放、曝光统计、点击跳转

街坊四邻

  • 网址:首页 - 街坊四邻
  • 应用范围:后台服务

Leanote

  • 网址:Leanote

Bearychat

  • 网址:BearyChat

宅豆

  • 网址:宅豆网 - 自筑最美家,宅豆随你搭

白板- 设计图讨论工具

  • 网址:白板

实验楼

  • 网址:实验楼 - 第一家以实验为核心的IT在线教育平台

新浪微博

中间件和弹性调度用 Java 和 Go 编写,微博视频转码及存储服务用 Go 编写。

爱奇艺

VR 后台系统中间件,VR 端的 HTTP 介面。

猎豹移动

消息推送

网易

网易蜂巢容器公有云。

哔哩哔哩

弹幕

巨人网路

部分手机游戏的服务端。

今日头条

Nsq:Nsq 是由Go语言开发的高性能、高可用消息队列系统,性能非常高,每天能处理数十亿条的消息;

Packer:用来生成不同平台的镜像文件,例如VM、vbox、AWS等,作者是vagrant的作者

Skynet:分散式调度框架

Doozer:分散式同步工具,类似ZooKeeper

Heka:mazila开源的日志处理系统

Cbfs:couchbase开源的分散式文件系统

Tsuru:开源的PAAS平台,和SAE实现的功能一模一样

Groupcache:memcahe作者写的用于Google下载系统的缓存系统

God:类似redis的缓存系统,但是支持分散式和扩展性

Gor:网路流量抓包和重放工具

还有很多,比如阿里中间件、聚美优品、高升控股、探探、斗鱼直播、人人车、亚信、Udesk、方付通、招财猫、三一集团、美餐网等。一般的选择,都是选择用于自己公司合适的产品系统来做,比如消息推送的、监控的、容器的等,Golang特别适合做网路并发的服务,这是他的强项,所以也是被优先用于这些项目。Go语言作为一门大型项目开发语言,在很多大公司相继使用,甚至完全转向Go开发。

……………………………………………………更于2019.4.23日………………………………………………

当然,一个技术能不能发展起来,关键还要看三点。

1、有没有一个比较好的社区。

像 C、C++、Java、Python 和 JavaScript 的生态圈都是非常丰富和火爆的。尤其是有很多商业机构参与的社区那就更为人气爆棚了,比如 Linux 的社区。

2、有没有一个工业化的标准。

像 C、C++、Java 都是有标准化组织的。尤其是 Java,其在架构上还搞出了像 J2EE 这样的企业级标准。

3、有没有一个或多个杀手级应用。

C、C++ 和 Java 的杀手级应用不用多说了,就算是对于 PHP 这样还不能算是一个好的编程语言来说,因为是 Linux 时代的第一个杀手级解决方案 LAMP 中的关键技术,所以,也发展起来了。

上述的这三点是非常关键的,新的技术只需要占到其中一到两点就已经很不错了,何况有的技术,比如 Java,是三点全占到了,所以,Java 的发展是如此好。当然,除了上面这三点重要的,还有一些其它的影响因素,比如:

  • 学习曲线是否低,上手是否快。这点非常重要,C++ 在这点上越做越不好了。
  • 有没有一个不错的提高开发效率的开发框架。如:Java 的 Spring 框架,C++ 的 STL 等。
  • 是否有一个或多个巨型的技术公司作为后盾。如:Java 和 Linux 后面的 IBM、Sun……
  • 有没有解决软体开发中的痛点。如:Java 解决了 C 和 C++ 的内存管理问题。

用这些标尺来量一下 Go 语言,我们可以清楚地看到:

  • Go 语言容易上手;
  • Go 语言解决了并发编程和写底层应用开发效率的痛点;
  • Go 语言有 Google 这个世界一流的技术公司在后面;
  • Go 语言的杀手级应用是 Docker,而 Docker 的生态圈在这几年完全爆棚了。

所以,Go 语言的未来是不可限量的。当然,我个人觉得,Go 可能会吞食很多 C、C++、Java 的项目。不过,Go 语言所吞食主要的项目应该是中间层的项目,既不是非常底层也不会是业务层。

也就是说,Go 语言不会吞食底层到 C 和 C++ 那个级别的,也不会吞食到高层如 Java 业务层的项目。Go 语言能吞食的一定是 PaaS 上的项目,比如一些消息缓存中间件、服务发现、服务代理、控制系统、Agent、日志收集等等,没有复杂的业务场景,也到不了特别底层(如操作系统)的中间平台层的软体项目或工具。而 C 和 C++ 会被打到更底层,Java 会被打到更上层的业务层。

好了,我们再用上面的标尺来量一下 Go 语言的杀手级应用 Docker,你会发现基本是一样的。

  • Docker 上手很容易。
  • Docker 解决了运维中的环境问题以及服务调度的痛点。
  • Docker 的生态圈中有大公司在后面助力。比如 Google。
  • Docker 产出了工业界标准 OCI。
  • Docker 的社区和生态圈已经出现像 Java 和 Linux 那样的态势。
  • ……

所以,虽然几年前的 Docker ,当时的坑儿还很多,但是,相对于这些大的因素来说,那些小坑儿都不是问题。只是需要一些时间,这些小坑儿在未来 5-10 年就可以完全被填平了。

同样,我们可以看到 Kubernetes 作为服务和容器调度的关键技术一定会是最后的赢家。


最后,我还要说一下,为什么要早一点地进入这些新技术,而不是等待这些技术成熟了后再进入。原因有这么几个。

技术的发展过程非常重要。因为你可以清楚地看到了这种新技术的生态圈发展过程。让我们收获最大的并不是这些技术本身,而是一个技术的变迁和行业的发展。

从中,我们看到了非常具体的各种思潮和思路,这些东西比起 技术本身来说更有价值。因为,这不但让我们重新思考已经掌握的技术以及如何更好地解决已有的问题,而且还让我看到了未来。不但有了技术优势,而且这些知识还让我们的技术生涯多了很多的可能性。

这些关键新技术,可以让你拿到技术的先机。这些对一个需要技术领导力的个人或公司来说都是非常重要的。

一个公司或是个人能够占有技术先机,就会比其它公司或个人有更大的影响力。一旦未来行业需求引爆,那么这个公司或是个人的影响力就会形成一个比较大的护城河,并可以快速地产生经济利益。

Go的应用范围一直在扩大,云计算,微服务,区块链,哪里都有用Go写的重量级项目。docker/kubernetes生态圈,几百/千万行代码,基本统治了云原生应用市场。去年大热的区块链,以太坊的geth,比特币的btcd,闪电网路的lnd,都是Go语言开发。

还是那句话,多看看各种语言的生态,或许都并没有你想像的那么不堪。。。Go语言设计上确实不够「先进」,但也是另一种「务实」。其实go不管在国内还是国外已经很受待见了,国外google用的很多,uber也在用,国内有著名的今日头条,每日千亿级的访问妥妥的。多少语言终其一生都没有这么大的应用场景。


可能习惯了Java的方式到Go确实有点不适应,反过来也会一样。

Java语言本身(不是JVM,没哪个VM不复杂的,除了Lua)并不复杂,复杂的是他的那些框架和库,学Java语言本身可能只要一周,学那些库和框架可能要你三个月。他们封装了很多东西,让你习惯之后可以按固定套路很快建起东西来,你的关注点会在框架而不是语言本身上。这是缺点也是优点。

Go对于框架和库和态度不太一样,你发现Go上根本没有如SSH那种风格的东西,它鼓励的是简单、清晰的package,不要总想著去搞那N层的抽象,一上手就各种介面、基类镇楼。想当年,刚开始用Python时我就是那样的,很快发现思路不对。

你需要的是转换思路,研究一个Go的开源项目,比如groupcache,就明白怎么玩了。Go上没有许多的框架给你用,因为很多人认为用不著,标准库、流行的第三方库80%的情况下够用,剩下20%不是多数人考虑的范围。Go这种风格确实不如Java写业务代码方便,但如果没办法的话,建议你尽量去适应它。

我们用Go做伺服器(整体系统微服务化,业务复杂度一般,但要求24x7运行不能停,不能出错),也做工控机上的程序(配合C写的,同样要求24x7不能出错),还做一些顺手的管理工具。与资料库打交道多的部分我们还是用Python,ORM配合动态语言实在出活快。


我是go超级爱好者和支持者。另外工作上主要还是以java为主(没办法,公司规定)

=============以下是go吹部分,纯吹,非战斗人员请撤离===============

1.性能好

golang最大的优势就是处理高并发请求占用资源非常小(goroutine的优势),并且编写对应并发程序以及日后的维护也非常容易。

所以小米的抢购,滴滴的很多服务,还有b站的很多服务, 还有许多许多公司的高并发相关的服务(无论国内国外)都转用golang重写,即省机器日后维护又方便还可以向公司领导邀功。网上应该都能搜到这些公司的技术文章,转用golang重写基本上都能省60%以上的机器资源,而且代码真的简洁明了。 现在很多游戏公司也使用golang来实现游戏服务端。

2. KISS

golang语法上抛弃了继承并且最佳实践里不建议使用设计模式。我觉得相对于java这是一个我非常非常喜欢的东西。golang的设计理念和unix的设计理念相同(因为创始人一样),KISS (Keep It Simple ,Stupid)。

我不清楚别人什么情况,我是超级讨厌java那种封装800层的处理方式,看别人代码的时候,经常会看到继承地狱和各种设计模式的结合,一层一层的点进去,再绕几个设计模式,真的要死的感觉。java代码会写成这样经常是因为要"重用性和可拓展性",最后却丢了可维护性, 说好的「高内聚,低耦合」呢?

golang相对来说从各方面鼓励程序员不要做大而全的东西,要做小并且简单的东西,然后这些小并且简单的东西串起来实现具体需求。具体有哪些方面?

介面,golang鼓励程序员在实现功能之前自己抽象好各个介面

方便的模块间通信,golang的io库极好用并且go有很好用的并发解决方案

极方便的测试用例方案,这个简直甩junit几万条街

所以如果按这些原则,工作也极好分配,介面模块抽象出来了,把模块向每个人一分,每个人保证测试用例没问题,模块之间介面一对接就OK了, 并且由于每个模块都非常小,还可以非常方便的写测试用例,出问题的概率也低了,即使出了问题,定位也会非常迅速。

还有就是用java做东西的时候,几乎必先学框架, web有servlet, jsp, jstl, tomcat, jetty, ssh, 以及各种「好用的」东西, 高性能网路处理要学netty,甚至有些人说学过java不学netty等于白学的说法。表面上这些框架听著很方便,口碑也很好,但每个框架都是有其学习成本以及各种坑!各种坑!各种坑!框架还会出现漏洞,框架用的越多,风险也就越大,struts2的漏洞当年可是非常有名啊。

3.golang其实非常好上手

不像java的各种框架,你需要对应学这些框架很多专门的东西。对于golang语言本身,大部分是只要你懂协议,你就可以上手写代码了。

你懂http协议?java你还要学servlet, jsp, jstl, tomcat, tomcat调优, jetty, jetty调优,SSH,才能实现一个产品级的http服务。golang的话,按需求写代码,然后编译出来可执行文件就行了。

你懂tcp/ip? java你要学netty,理解netty里专有的各种概念(Channel, ChannelPipeline, ChannelHandler, ChannelHandlerContext, ChannelFuture, ChannelPromise),理解netty的用法,熟悉netty的各种坑, 各种网上搜netty原理解析,最后看看netty源码,就可以实现传说中的能承载高并发的伺服器。golang的话,按需求写代码,然后编译出来可执行文件就行了。我曾经用netty和golang实现过相同的功能,相比之下golang的代码非常直观,而netty的话,你在会使用netty的情况下思路还要绕几下才能明白你是如何实现这个功能的, 因为你在netty的架子下。

最后golang大法好!匿名防喷~


推荐阅读:
相关文章