50 【Go版本变化】 - awildfish

50 【Go版本变化】

Go的版本介绍:https://golang.org/project/

https://golang.org/doc/go1.4

#Go1.4#

语言层面变化较少,但是编译器而言是有巨大的突破的,体现在指针间的转换。

这个release核心聚焦在实现工作上,重点是garbage collector(垃圾回收)和并行处理的垃圾回收器,这些改动也会在之后的几个版本中不断优化。

并且,栈区是连续的,需要内存时能真实分配地址,而不是通过link方式链接到其它区。这个版本也减轻了“hot stack split”的问题。

Go1.4也保证了兼容性,绝大部分代码可以直接运行在上面,而不需要改动。

===改变:range===

for i, v := range x {

...

}

for i := range x {

...

}

Go1.3支持以上两种range格式

Go1.4增加了一种range遍历:

for range x {

...

}

===改变: Methods calls on **T===

type T int

func (T) M() {}

var x **T

both gc and gccgo accepted the method call

x.M()

这里x是二维指针,需要两次解引用。这种调用方式在Go1.4不再被允许

===change: 支持的平台===

Android, NaCi on ARM, Plan9 on AMD64

===change: 兼容性指导===

unsafe的类型转换不保证兼容性

===change: runtime的改进===

在Go1.4之前的版本,runtime(garbage collector, concurrency support, interface management, maps, slices, strings, ..)大部分是用c语言完成的,和少量的汇编语句。

Go1.4做出了改变,runtime已经完全换成Go语言了。这意味着Go能很精确的知道分配的空间和变量。

...

===Assembly===

===gccgo===

==改变: internal packages===

可能有些包仅放在包内,而不希望被外部所访问。之前的Go是不支持的,Go1.4为了让这种需求变得可能,定义了internal packages机制。

/a/b/c/internal/d/e/f,这里的internal包仅允许/a/b/c所访问,而不能被/a/b/g所调用。

===source layout调整===

去除了src/pkg这一层,从src/pkg/fmt调整为src/fmt

===SWIG===

Go1.4需要SWIG3.0.3版本

===性能===

大部分程序,1.4和1.3的性能相差相近,甚至有时候Go1.4会更慢。

GC肯定是更快了

=====标准库=====

A,没有新的packages

B,Major packages

. bufio.Scanner

. syscall

C. Minor packages

不再一一列出,参考:https://golang.org/doc/go1.4

==========Go1.5=========

Big:

. complier全部用C重写,C编译器不再需要了

. GC垃圾回收器现在是并行处理的(concurrent)

. 默认状态,GOMAXPROCS变量和可用core数一致,之前的版本默认是1;

. internal packages机制全部支持,不是仅限于core package

. go提供了实验性质的支持,对于vendor目录

. go tool trace命令可一直追踪调试

. go doc可以custom,之前仅支持默认格式,不可修改

===Language change===

m := map[Point]string{

Point{29.935523, 52.891566}: "Persepolis",

Point{-25.352594, 131.034361}: "Uluru",

Point{37.422455, -122.084306}: "Googleplex",

}

m := map[Point]string{

{29.935523, 52.891566}: "Persepolis",

{-25.352594, 131.034361}: "Uluru",

{37.422455, -122.084306}: "Googleplex",

}

Go1.5可以支持Point不再显式写出来

===Implement===

==No more C==

编译器和汇编器不再依赖C,是全部用Go重写了。

仅仅C source是由cgo来处理的。这里在Go1.4是由c编译器处理的。Go1.5版本,即使C source tree,编译的时候用的也是Go编写的编译器。

==编译器和tools==

编译器重写后,编译时会生成一些中间obj,之前的版本这些obj的后缀是.8g, .6g。Go1.5开始,这些object的后缀全部修改成.o

==GC垃圾回收器==

Go1.5 重新设计了GC的部分。GC的调度更优,期待GC延迟比之前要更好.

==Runtime & Build & Ports==

===Tools===

==Translating==

==Renaming==

==Moving==

==Compiler==

==Assembler==

==Linker==

==Go commands==

==Go vet command==

==Trace command==

==Go doc==

==Cgo==

===性能===

没办法准确地衡量,有的会更快,有的会更慢。很多剩余工作需要完成,这些会放在Go1.6之后的版本完成。

===Core library===

. Flag

. Floats in math/big

. Go types

. Net

. Reflect

. Hardening

===Minor changes===

不再一一列出,参考:https://golang.org/doc/go1.5

=====Go1.6====

===语言变化===

没有

===Ports===

===Tools===

==Cgo==

Cgo编译器之前用go重写了,这次又再次进行了优化。

主要变化:go和c可以共享Go分配的内存了

==Compiler工具链==

==Gccgo===

==Go command==

Go1.5开始对vendor进行实验性的支持,Go1.6不再只是实验性质,而是默认支持了。

==Go doc==

==Go vet==

===性能===

相比较Go1.5,有的更快,有的更慢了

===Core lib===

==Http2==

支持了Http2协议,client和server在使用HTTPS时能恰当地处理HTTP2请求

==Runtime==

runtime提供了maps轻量级的冲突检测机制。

程序结束时的panic,tuntime默认打印当前running的goroutine栈信息。而不是所有的goroutines,能显著地快速定位到问题原因。

==Reflect==

==Sorting==

排序减少了10%的calls

==Templates==

{{block}}可以支持明明的子模板,能增加复用性

==Minor changes==

不再一一列出,参考:https://golang.org/doc/go1.6

===============Go1.7=====================

Go1.7增加了一些平台的支持。更新了X86-64编译器的后端模块。

也包含了以下包的修改:context包,x/net。testing包提供了对层次结构的testing的支持,以及benchmark的支持。

该版本彻底完成了对vendor的支持

====Language change====

==Ports==

====Tools====

==Assembler,Compiler Toolchain==

==Cgo==

Cgo的包现在可能可以支持Fortran源码(包括C,c++, Objective-C, SWIG),尽管Go绑定必须使用C语言API

Go绑定当前可能可以使用新的helper函数(C.CBytes)。

C.CString能把GO的string转换成*C.byte(C语言的char*)

C.CBytes能把GO的[]byte转换成unsafe.Pointer(C语言的void*)

==Gccgo==

==Go command==

==Go doc==

==Go vet==

==Go tool dist==

go tool dist list能将GO目前支持的所有的OS和平台都列出来

==Go tool trace==

go tool trace已经在之前的版本中支持

1 收集traces信息比之前的版本都更有效。收集trace的消耗时间是25%,之前的版本是400%。

2 trace file支持file和line number.

3 trace工具会break up大的trace以避免感染到正在请求的用户

==性能==

当前版本,在我们的基础性能测试中,code generation changes alone typically reduce program CPU time by 5-35%

感觉不是二进制运行时间有调整,是代码编译时间有降低

很多包有做优化,包括crypto/sha1, crypto/sha256等包

垃圾回收的pause也比Go1.6更短

==Core library==

=Context=

Go1.7把golang.org/x/net/context移动到标准库context包。这就允许取消context,context超时,传递request-scoped数据,包括net包,net/http,os/exec等包

更多信息参考release note

==http tracing==

go1.7引入了net/http/httptrace,这个包提供了对HTTP request的tracing event的支持

==Testing==

testing支持了subtest和subbenchmark的支持,使得层次化testing更方便

==Runtime==

runtime有多处改变,详情请看release note,不再一一列出

==Minor change==

bufio...,不再一一列出,详情请看release note

net/http中有较多修改



=====GO1.8=====

更新了compiler后端(生成更有效的代码)

减少了gc的pause时间(消除了stop-the-world的rescan)

增加了HTTP/2 push支持

增加了http的gracefull shutdown

增加了更多的context支持

启用了profiling mutexes

简化了sort slice

==语言变化==

func example() {

type T1 struct {

X int `json:"foo"`

}

type T2 struct {

X int `json:"bar"`

}

var v1 T1

var v2 T2

v1 = T1(v2) // now legal

}

之前的转换忽略了tag信息,现在加上了tag的转换

====ports====

增加了更多的平台的移植

====Tools====

==Assembler==

==Yacc==

yacc工具被移除。Go1.7中,yacc工具不再被go编译器使用。它被放在golang.org/x/tools/cms/goyacc工具包中

==Fix==

==Pprof==

pprof工具可以检测TLS server并且可以忽略证书验证,使用https+insecure模式

==Trace==

trace工具支持了--pprof选项

==Vet==

==compiler toolchain==

==Cgo, Gccgo, Default GOPATH, Go get, Go doc, Plugins==

====Runtime====

Argument liveness:参数的存活时间,Go1.7支持一个变量长时间存活

Concurrent maps:并发情况下的maps下的乱用,增加了race detector,竞争检测

Memstats:增加了运行时的内存监控,runtime.Memstats

====性能====

对性能影响比较难以估量,有一点点优化,包括bytes, crypto/aes等package

==GC==

gc的pause时间要比go1.7更少,通常是100毫秒,而且大部分是在10毫秒以内。有篇文章专门描述了此次优化 https://github.com/golang/proposal/blob/master/design/17503-eliminate-rescan.md

==Defer==

defer的开销降低一半

==cgo==

go转c的开销降低一半

====标准库====

==Sort==

sort包支持了less函数,意味着它更加通用,不用再重复编写sort相关的代码

==Http2/push==

net/http包支持了发送HTTP/2的server push

类似于Flusher/hijacker接口,http2的ResponseWriter实现了新的Pusher接口

==Http server graceful shutdown==

http服务器能支持graceful shudown,使用Server.shutdown方法

==More context support==

==Mutex contention profiling==

支持对包含内容的mutext进行profile

=====Minor changes===

细小改变很多,不再一一列出,详情请看release note

其中改动较多的有net/http, net/url, os, time等包



======GO1.9=====

====语言上的变动====

1,支持类型重命名: type T1 = T2

2,x*y + z,float64(x*y)+z这两种形式不同,具体为啥不同,没看懂

===Ports移植平台====

====Tools====

并行编译

vendor: 用./...不再匹配vendor的包,新的格式: ./vendor/...

GOROOT

Compiler toolchain

Aessmbler

Doc

Env

Test

Pprof

Vet

====runtime===

支持打印栈内帧

runtime.CallersFrames在Go1.7就支持了

====性能====

大部分程序会更快那么一点点,原因是GC的加速,better generated code,核心库的优化

====Core library====

Transparent Monotonic Time support:看不懂

New bit manipulation package:数学的bits运算,看不懂

Test helper func:(*T).Helper (*B).Helper

Concurrent maps:并发的maps操作是支持的,这个包在package sync中,map type。在多个goroutine的增删改是安全的

Profiler labels:runtime/pprof包现在支持对pprof加标签

====Minor changes====

不再一一列出,详情请看release notes

比较多的修改点有:database/sql, net/http, time