Go的2017回顾和2018展望

RA681t58CJxsgCkJ31 · · 2396 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

Golang在过去一年取得的重要成绩(包括重点项目的成绩)


2017年可以说是Go在云计算取得了领导地位,kubernetes已经成为了所有云计算公司的底层架构,而且越来越多的互联网公司系统架构迁移到k8s上面,例如github、阿里、腾讯、百度、滴滴、京东等大型企业纷纷拥抱,而这个系统就是Go开发的,很多公司都开始大力的投入工程师在Go开发中来,Go一下子就成为了云计算的核心语言,大家应该都听过一个组织叫做CNCF,云计算基金会组织,下面孵化了一堆的云计算项目,https://www.cncf.io/ 就可以看到基本上90%的项目都是Go语言开发的,从这个我们可以看出来Go已经成为了名副其实的云计算系统语言。


同时又是Go在第二领域开始发力的一年,我所说的第二领域就是区块链,大家都知道比特币在过去一年可以说迅速的火爆全球,而它的底层技术区块链技术也是开始获得大家的认知,这个可以说是区块链1.0版本应用,而区块链2.0版本应用就是智能合约以太坊开始获得所有人的认知,基本上目前大多数做区块链的公司都是基于以太坊进行二次开发,而以太坊的底层正是Go开发的,同时IBM也开源了他们的fabric,Fabric是一个分布式账本平台方案,主要用于运行智能合约,利用可靠的技术以及可插拔方式实现各种商业应用场景的模块化架构,而且这个系统也是Go开发的,这两个区块链里面的明星项目都是用Go开发的,足以说明Go在分布式系统中的地位,这也就是为什么今年开始大批量的金融公司开始招聘Go工程师。


Golang最近几次版本更新要点


最近两个大版本分别是Go1.9和Go1.10,我就对于这两个版本里面带来的几个新特性大概的介绍一下。


语言层面:

  1. Type alias

我们都知道Go代码重构过程中最大的难点就是兼容性,而Go里面我们一旦导出的变量、函数等如果想要再次重构,那么就会变得非常困难,这个特性的引入就是为了解决这个问题的,最初由Robert Griesemer提出来这个特性的,计划在1.8版本加入,但是时间紧迫推迟到了1.9版本才加入。

官方对type alias的定义非常简单:

An alias declaration binds an identifier to the given type.


我们怎么来理解新增的type alias和传统的type definition的区别呢?

type T1 T2  // 传统的类型定义vs.type T1 = T2 //新增的类型化名


把握住一点:传统的类型定义创造了一个“新类型”,而类型化名并没有创造出“新类型”


性能优化:

  1. 编译性能

在Go 1.9中,在原先的支持包级别的并行编译的基础上又实现了包函数级别的并行编译,以更为充分地利用多核资源。Go 1.10的编译性能最大的改变在于cache机制的实现。事实证明cache机制的使用,在日常开发过程中会很大程度上提升你的工作效率,越是规模较大的项目越是如此。

   2.目标代码的性能

这些年Go team在不断优化编译器生成的目标代码的性能,比如在Go 1.7版本中引入ssa后端。Go 1.10延续着对目标代码生成的进一步优化,虽说动作远不如引入ssa这么大。

   3.GC性能

GC的性能一直是广大Gopher密切关注的事情,在Go 1.9中依旧继续优化和改善,大多数程序使用1.9编译后都能得到一定程度的性能提升。1.9 中尤其提到了大内存对象分配性能的显著提升。Go 1.10在减少内存分配延迟以及GC运行时的负担两个方面做了许多工作,但从整体上来看,GC变化不是很大。


标准库:

  1. 增加monotonic clock支持

2017年元旦之夜,史上第27次闰秒出现,正是因为这个闰秒的出现,欧美知名CDN服务商Cloudflare的DNS出现大规模故障,导致欧美很多网站无法正常被访问。之后,Cloudflare工程师分析了问题原因,罪魁祸首就在于golang time.Now().Sub对时间的度量仅使用了wall clock,而没有使用monotonic clock,导致返回负值。一般来说,wall clock仅用来告知时间,mnontonic clock才是用来度量时间流逝的。为了从根本上解决问题,Go 1.9在time包中实现了用monotonic clock来度量time流逝,这以后不会出现时间的“负流逝”问题了。这个改动不会影响到目前大家对timer包的方法层面上的使用。

    2.增加math/bits包

在一些算法编程中,经常涉及到对bit位的操作。Go 1.9提供了高性能math/bits package应对这个问题。

   3.提供了一个支持并发的Map类型

Go原生的map不是goroutine-safe的,尽管在之前的版本中陆续加入了对map并发的检测和提醒,但gopher一旦需要并发map时,还需要自行去实现。在Go 1.9中,标准库提供了一个支持并发的Map类型:sync.Map

   4.增加strings.Builder

strings包增加一个新的类型:Builder,用于在“拼字符串”场景中替代bytes.Buffer,由于使用了一些unsafe包的黑科技,在用户调用Builder.String()返回最终拼成的字符串时,避免了一些重复的、不必要的内存copy,提升了处理性能,优化了内存分配。

   5.支持profiler labels

通用的profiler有时并不能完全满足需求,我们时常需要沿着“业务相关”的执行路径去Profile。Go 1.9在runtime/pprof包、go tool pprof工具增加了对label的支持。Go team成员rakyll有一篇文章“Profiler labels in go”详细介绍了profiler labels的用法,可以参考,这里不赘述了。


哪些公司在重点使用Golang,哪些公司对Golang有兴趣?


目前使用Golang 的国内国外公司都非常之多,我这边大概的列一下主要的公司

国外公司列表

公司名

产品或网址

Google

Kubernetes,vitess,seesaw

Docker

moby

hyper

hyper

CoreOS

etcd, rocket

Prometheus

Prometheus

grafana

grafana

国内公司列表

公司名

产品或网址

积梦智能

https://jimeng.io

七牛

https://qiniu.com

滴滴


百度


阿里云


腾讯云


UCloud


PingCAP

tidb


更多的公司可以参考这里:https://github.com/golang/go/wiki/GoUsers


重要的Golang开源项目


目前Go里面开源的大项目太多了,大家可以参考我们最近做的知识图谱上面的一些开源项目,包含了云计算、devops、区块链、人工智能、游戏、存储引擎、Web、系统/命令行工具、中间件、测试/持续交付、文件系统等各方面的开源项目。


640?wx_fmt=png


详细地址:https://www.processon.com/view/link/5a9ba4c8e4b0a9d22eb3bdf0


初学者怎么入手Golang,推荐一些学习型的项目


我觉得学习一门语言最重要的就是做到三点,第一看基础知识,第二学习抄代码,第三学习写代码


第一点,很多人都觉得上来就动手写,但是你基础的东西都没掌握,怎么写呢?欲速则不达,所以基础的东西还是必须要先掌握好.这里推荐几个基础的入门材料:

  • https://tour.golang.org/#1

  • 邢星翻译的 https://github.com/mikespook/Learning-Go-zh-cn

  • Go byExample https://gobyexample.com/

我觉得你把这几个基础掌握之后就可以开始抄袭代码了,如果你之前有PHP的开发经验,那么也许我写的这本书对你了解golang有帮助, https://github.com/astaxie/build-web-application-with-golang


第二点,我们很多时候开始写代码都是没什么思路,也无从下手,但是我们可以模仿别人写代码,上海俗话里面常说"吃大户,用大户,消灭大户",我们就是"看代码,抄代码,最后自己写代码".这里给你几个入门级别的代码看看学习一下:

  • https://github.com/hoisie/web 很简单,就是学习他的路由怎么实现的,如何编写自己的路由

  • https://github.com/icub3d/home/这是一个Go+ AngularJS的实现,看看如何做API应用

最后我列一下你可以自己参考去实现的一些功能,我当初培训我们战虎班的同学就是用这些来一起学习的.

  • 日志分析

  • IP库分析

  • 管理后台查看分析日志


第三点,自己写代码,这个时候就是已经对golang有了一定的了解了,那么我们就可以开始做自己的项目了,做项目最想就是快速开发,那么我就推荐你

  • https://github.com/astaxie/beego 使用beego框架可以很快速的开发你的Web或者API应用

  • https://www.docker.com/ 使用docker来做虚拟化

  • https://github.com/nsqio/nsq 学习消息队列,学习channel和分布式

  • https://github.com/coreos/etcd 分布式应用

这个阶段就是找各种东西用golang来写,多写就会理解越来越深入. 




第四届 Gopher China 大会4月将在上海举办,今年也是第一次增加了会前的 培训 。本届的大会无论从规模,内容都将有更多值得大家期待的!

相关阅读:

重磅发布-2018 Gopher China 议题揭晓

国际名师 William 带来终极 Go 培训

Go 语言发展史及史上最全 Go 语言知识图谱!


点击阅读原文报名2018 Gopher China 大会,最后一波早鸟票!

4月1日起恢复888原价〜

Go 中国粉丝独家福利优惠码GopherChina

报名输入可享85折优惠!数量有限,先到先得哦〜


有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:RA681t58CJxsgCkJ31

查看原文:Go的2017回顾和2018展望

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2396 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传