50 【Go版本變化】

Go的版本介紹:https://golang.org/project/c++

 

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

#Go1.4#

語言層面變化較少,可是編譯器而言是有巨大的突破的,體如今指針間的轉換。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

==========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

相關文章
相關標籤/搜索