Go的版本介绍:https://golang.org/project/c++
https://golang.org/doc/go1.4git
语言层面变化较少,可是编译器而言是有巨大的突破的,体如今指针间的转换。github
这个release核心聚焦在实现工做上,重点是garbage collector(垃圾回收)和并行处理的垃圾回收器,这些改动也会在以后的几个版本中不断优化。
而且,栈区是连续的,须要内存时能真实分配地址,而不是经过link方式连接到其它区。这个版本也减轻了“hot stack split”的问题。golang
Go1.4也保证了兼容性,绝大部分代码能够直接运行在上面,而不须要改动。sql
===改变:range===
for i, v := range x {
...
}
for i := range x {
...
}
Go1.3支持以上两种range格式
Go1.4增长了一种range遍历:
for range x {
...
}json
===改变: 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
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
===语言变化===
没有
===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增长了一些平台的支持。更新了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中有较多修改
更新了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等包
====语言上的变更====
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