Go 语言发展历程及应用实践

2016.10.15

黄庆兵 #Gopher Meetup 杭州#

网易云 网易蜂巢

自我介绍

2

分享目录

3

编程语言的历史与现状

- 单机时代
- C 语言
- 成功原因:简单、对机器的绝佳抽象
- 互联网时代
- Java 语言
- 成功原因:机器性能的提升,软件规模与复杂度提高
- Java 语言的份额继续下滑,最终被 C 和 Go 语言超越
- C    语言将长居编程榜第二的位置,有望在 Go 取代 Java 前重获语言榜第一的宝座
- Go   语言最终会取代 Java 居于编程榜之首
- 成功原因:Go 以 C 语言为原型,以降低心智负担为设计理念,易学习,高品质,大道至简,目标解放程序员
4

Go 发展历程

5

Go 发展历程

- 创始者三剑客:Ken Thompson, Rob Pike 和 Robert Griesemer
- 而后加入的人:Russ Cox, Ian Lance Taylor, Brad Fitzpatrick, Andrew Gerrand 等
- 有Google这个显赫的爹
- Go 1   (3月  2012)
- Go 1.1 (5月  2013)
- Go 1.2 (12月 2013)
- Go 1.3 (6月  2014)
- Go 1.4 (12月 2014)
- Go 1.5 (8月  2015)
- Go 1.6 (2月  2016)
- Go 1.7 (8月  2016)
6

TIOBE 2016年10月榜 TOP20 编程语言榜单

7

TIOBE 年度编程语言(2003-2015)

8

TIOBE Top10 指数走势(2002-2016)

9

Go Team

10

Go Team - 三个泰斗级的人物

- 设计了B语言、C语言。创建了Unix和Plan 9操作系统,UTF-8的主要设计者。1983年图灵奖得主。Go的创立者之一。
- Unix小组成员,参与Plan 9、Inferno操作系统。UTF-8编码的创立者之一,r@google.com。Go的创立者之一。
- 曾设计了Chrome浏览器的JavaScript V8引擎,协助制作Java的HotSpot编译器。Go的创立者之一。
11

Go Team - 几个独当一面的人物

- 参与Plan 9操作系统开发。Google Code Search项目负责人
- gcc 社区的活跃人物。gold连接器和gcc过程间优化LTO的主要设计者,Zembu公司的创始人。
- LiveJournal 创始人,著名开源项目memcached的作者
- 2010年2月加入Google和Go team,多次担任 Go 的发言人。澳大利亚人,本科专业摄影,艺术学位。
12

Go Team - “炉边谈话”

www.youtube.com/watch?v=sln-gJaURzk

www.youtube.com/watch?v=p9VUCp98ay4

www.youtube.com/watch?v=ynQoaajojIs

13

Go 的创立故事

14

Go 的创立故事

15

Go 的创立故事

16

Go 最初的设计

- Robert:以C语言为原型,修补部分明显的缺陷,去掉垃圾功能,添加一些缺失的功能。

- Rob:命名为“Go”,好处有很多,这名字非常简短,容易拼写。工具可以叫做:goc、gol、goa。
  如果有可交互的调试器/解释器也可以简单地叫它“Go”,后缀名用.go。

- Robert:定义空接口语法:interface{}。所有接口都通过这个实现,因此可以用它代替void*。
17

Go 最初的代码提交

$ git log --before={2008-03-03} --reverse
18

Go 语言起源

哪些早期的编程语言对Go语言的设计产生了重要影响
19

Go 主要特性列表 - "21世纪的C语言"

- 垃圾回收(GC)

- 轻量级线程(goroutine)和消息通信(channel)

- 反射(reflect)

- 字母大小写设置可见性(letter case sets visibility)

- 函数多返回值、更好的错误处理规范

- 匿名函数和闭包

- 类型(type)和接口(interface)接口只有方法(没有数据)

- 包(package)(无循环依赖)

- 更丰富的内置类型:slice、string、map等

- 更丰富的标准库
20

Go 的设计理念

https://commandcenter.blogspot.com/2012/06/less-is-exponentially-more.html
- New features can weaken existing features.
- Features multiply complexity.
- Complexity defeats orthogonality.
- Orthogonality is vital: it enables composition.
Go从头到尾都是以替代C++为目标来设计的,却少有吸引到C++程序员,大部分都是从Python和Ruby转过来的
21

Go 的版本历程

22

Go 已发布的版本

23

Go 1.8

2月 2017

24

Go 1.9

8月 2017

25

Go 2.0

2月 2018

26

让人兴奋不已!?!?

27

不好意思

28

让你们失望了

29

Go 将要发布的版本

2月 2017

8月 2017

2月 2018

8月 2018

30

那么。。。什么时候 Go 2 会出来呢?

31

官方说法

遥遥无期
就这么着
32

Gopher - Sad

33

Gopher - Angry

34

Gopher - Hug

35

Go 的版本变化

36

Go 1

- append([]byte, string…)
- disallow close on receive-only channels
- composite literal type ellison
- goroutines during init
- the rune type
- the error type (interface type in global scope!)
- delete(m, k)
- random map iteration order
- struct equality
- copying structs with unexported fields
- https://tip.golang.org/doc/go1
37

Go 1.1

•p.Write
  等价于:func(b []byte) (int, error) {return p.Write(b) }
•自 Go1.1 后,int,uint 的尺寸统一是 64bits,即使是在 32bits 平 台下。
•在 go1.1 或以上的版本 编译: //  build go1.1
38

Go 1.1

- 全新实现 map,更小的内存占用和CPU开销
- GC 性能优化
- 网络库性能优化:减少上下文切换
- gc编译器做了更多内联工作(inline),包括一些运行时的操作,如append和interface转换
- 一些尚未稳定的库从标准库移除
  • 迁移到 code.google.com/p/go.exp 或 code.google.com/p/go.text 中
- 新增的包(package)
  • go/format • net/http/cookiejar • runtime/race
- http://tip.golang.org/doc/go1.1
39

Go 1.2

- 三下标切片(Three-index slices):array[begin:end:endcap]
- 标准库 compress/bzip2, crypto/des, encoding/json 性能优化
- 新增的包(package):encoding, image/color/palette
- godoc, vet 工具从 go 发布中移出
- 测试覆盖率
  • code.google.com/p/go.tools/cmd/cover
- http://tip.golang.org/doc/go1.2
40

Go 1.3

• Go1.3以前,垃圾回收对指针的判断是经验性的:如果某个整数值恰 巧是一个合法的指针,那么它会被当做指针处理

• Go1.3调整为精确GC,这会导致以前的有些编程手法失效:
• Go1标准指出:对map的多次遍历不应该假设有同样的次序

• 为了避免这样的假设发生,Go1.0遍历map选择起点时用了随机数

• Go1.1用重新实现map后,小map的遍历没有引入随机数;Go1.3重新 引入,以消灭此类潜在bug
41

Go 1.3

- 大大降低 defer 的内存开销

- 引入并行 GC 算法,大幅度改善 GC 效率

- 竞争检测算法(race detector) 大幅提速

- 优化 regexp 包,改善大部分简单正则表达式的性能
- 新增的包(package):debug/plan9obj
- http://tip.golang.org/doc/go1.3
42

Go 1.4

- 增加一种非常小概率使用的for range语法
  for range x { ... } 等价于 for _ = range x {...}
// +build OMIT
package main

import "fmt"

func main() {
    var a [5]int = [5]int{2, 3, 4, 5, 6}
    for k, v := range a {
        fmt.Println(k, v)
    }
    for k := range a {
        fmt.Println(k)
    }
    for _ = range a {
        fmt.Println("print without care about the key and value")
    }
    for range a {
        fmt.Println("new syntax – print without care about the key and value")
    }
}
43

Go 1.4

- 不再自动对 **T 进行解引用(dereference)
  •对 var x **T,以前可直接用 x.M() 调用 T 的方法
  - 现在需要明确写 (*x).M()
// +build OMIT
package main

import "fmt"

type T int

func (T) M() {
    fmt.Println("Call M")
}

var i *T
var x **T

func main() {
  i = new(T)
  x = &i

  i.M()
  x.M()
}
44

Go 1.4

- 开始支持 Android (编译出binary或.so)
- 运行时(runtime)
  - 大部分用Go重写(以前是C)
  - 好处:更加精确的GC
  - 放弃了分段栈(segmented stack)
- http://tip.golang.org/doc/go1.4
45

Go 1.5

// +build OMIT
package main

import "fmt"

type Point struct {
	x float64
	y float64
}

func main() {
    var x1 = map[Point]int{
        Point{1.0, 2.1}: 1,
    }
    var x2 = map[Point]int{
        {2.1, 1.0}: 2,
    }
	fmt.Println("x1", x1)
	fmt.Println("x2", x2)
}
- 自举:不再有C,所有代码(包括编译器、链接器和运行时)都用Go和少量汇编实现
- GC:重写GC,进一步降低GC的latency
- GOMAXPROCS 默认是 CPU 数(以前是1)
- vendor支持:需要设置 GO15VENDOREXPERIMENT
- 开始支持 iOS:为此 Go team 还提交了第一个 Go 写的 AppStore 应用 Ivy
- http://tip.golang.org/doc/go1.5
46

Go 1.6

- 支持的操作系统:
  - Windows, OSX (darwin), Android, iOS, NaCl, DragonflyBSD, FreeBSD
  - Linux, NetBSD, OpenBSD, Plan 9, Solaris/Illumos
- 支持的架构:
  - Intel (386 and amd64), arm (ARMv5, v6, v7), arm64
  - 64 bit PowerPC (big and little endian), 64 bit MIPS (big and little endian)
- GC更精确
- 内建HTTP/2支持
- template包
- 性能更好
- http://tip.golang.org/doc/go1.6
47

Go 1.7

- vendor默认支持:不在需要设置 GO15VENDOREXPERIMENT
- `go tool dist list` 命令将打印所有go支持的系统和硬件架构
- 更快更小的生成二进制文件
- 编译器编译性能
- 支持subtests和sub-benchmarks
- 将原来的golang.org/x/net/context包挪入了标准库中
- http://tip.golang.org/doc/go1.7
48

Go 1.x 总结

- Go语言4年发布了7个大版本,语言特性没有实质性的变化
- 降低心智负担
- 细节完善
- 工程化
- 性能,性能,性能!性能优化,尤其是GC
- 更多平台的移植
- 更进一步的标准化,强化社区约定
- 3到5年内,Go的主攻方向仍然是服务端开发
- 站在10年的维度,Go语言会在桌面端(Mobile)大放异彩, 占据重要地位
49

Go 趋势图

50

Go 趋势图

51

Go 学习实践

52

学习 Go 的八大理由 - By ASTA谢

- 类C语法,GC内置
- 工程工具
- 接近C的运行效率
- 接近PHP的开发效率
- 诞生于几位泰山北斗之手
- 出生于Google这个名门
- 组合的思想
- 无侵入式的接口
53

学习 Go 的八大理由 - By ASTA谢

- 互联网应用
- 系统编程,网络编程
- 二进制文件
- copy 部署
- 降低心智的并发
- 简易的数据同步
- 强大的编译检查,严格的编码规范
- 完整的软件生命周期工具
54

学习方式

- 学习基本语法和命令操作,参照实例学习
- Go Tour
- How to Write Go Code
- Effective Go : gitbook@bingohuang
- Go By Example
- 无闻的《Go 编程基础》
- 郝林的《Go 语言第一课》
- 进阶:web开发《Beego 视频教程》
- Go Team《The Go Programming》又称 《Go 语言圣经》
- asta谢 《Go Web 编程》*开源书籍
- 许式伟  《Go 语言编程》
- 郝林   《Go 并发编程》
- 雨痕   《Go 学习笔记》 *开源书籍
55

学习方式

- Go Tour: http://tour.golang.org/
- How to Write Go Code: http://golang.org/doc/code.html
- Effective Go: https://www.gitbook.com/book/bingohuang/effective-go-zh-en/details
- Go By Example: http://gobyexample.com/
- 《Go 编程基础》: http://study.163.com/course/introduction.htm?courseId=306002#/courseDetail
- 《Go 语言第一课》: http://www.imooc.com/learn/345
- 《Beego 视频教程》: http://beego.me/video
- 《Go Web 编程》: https://www.gitbook.com/book/astaxie/build-web-application-with-golang/details
- 《Go 学习笔记》: https://github.com/qyuhen/book
56

如何实践:编程实践+社区开源

57

Go 在云计算和微服务领域的开源项目 - By ASTA谢

58

Go 在网易云的应用实践


59

Thank you

2016.10.15

黄庆兵 #Gopher Meetup 杭州#

网易云 网易蜂巢

Use the left and right arrow keys or click the left and right edges of the page to navigate between slides.
(Press 'H' or navigate to hide this message.)