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

上一篇:sqlserver 存储过程 游标实例


下一篇:redis的常用命令01