Go1.6 和 Go語言聖經中文版 正式發佈!

Go1.6 和 Go語言聖經中文版 正式發佈!

Go1.6正式版本發佈。在 https://golang.org/doc/go1.6 可以預覽Go1.6的發佈信息。自Go1.5發佈以來的重大變化有以下幾個:

  • 《Go語言聖經》 面世標誌着Go語言將進入下一個快速發展階段。
  • 制定了Go語言和C語言之間的指針傳遞規範,深度cgo用戶可以放心了。
  • Go1.6開始全面支持 HTTP/2 國際標準,感謝 @bradfitz 大神的努力。
  • 模板和反射包的改進,這部分我用的不多。
  • print/println/panic修復中文亂碼問題。
  • 標準庫中其它包的改進。

《Go語言聖經》

《Go語言聖經》(英文名:《The Go Programming Language》) 是由Go語言核心團隊成員 Alan A. A. DonovanK&R 中的 Brian W. Kernighan 操刀完成。幾乎大部分Go語言核心成員都參與了校對工作,該聖經介紹了Go幾乎全部特性,隨着語言的深入層層遞進,並且解讀得非常細緻。其中比較能反映Go語言特色的是第七章接口和第八九章併發編程等章節,不過每一節內容都精彩不容錯過,是廣大Gopher的必讀書目。

Go語言聖經的官網提供了英文版第一章的預覽,不過網上已經有完整的PDF版本可以下載,大家可以自己放狗去搜。需要私下交流的請轉QQ羣(531508541)。

Go語言聖經

PS: 其中中文版只是爲了便於學習和交流,希望不要用於商業目的。

編譯器工具鏈

編譯器的語法分析部分全部採用手寫代碼實現,代替以前基於yacc工具實現的分析器。其中yacc將不再是Go語言核心工具,可能會移動到外圍擴展包中。

Go1.5,已經對Linux和Mac OS X等平臺提供了靜態庫和動態庫的支持。Windows版本的DLL支持始終還沒有到來,不過目前社區已經有人初步實現了該功能(Issue11058),期望Go1.7能合並進來。

同時,Go1.6將默認啓動Go1.5引入的vendor特性支持。目前,可以通過將GO15VENDOREXPERIMENT環境變量設置爲0來關閉它。不過在Go1.7之後將刪除GO15VENDOREXPERIMENT環境變量,vendor的支持將成爲常態。

LLDB將支持Go語音調試: http://ribrdb.github.io/lldb/ 。另外,微軟的VSCode也開始提供插件支持Go語言的調試(基於Delve調試器)。

另外,編譯器部分的SSA優化特性還沒有啓用,估計要等到Go1.7了。

PS:期望下個版本中,能夠提供工具自動將以來的包自動提取到vendor目錄,同時記錄相關依賴包的版本信息。

cgo的指針傳遞規範

這部分是比較大的改動,不過大部分用戶沒有用到cgo的功能。

簡單來說,可以將不包含嵌套指針的Go對象的指針通過cgo傳入C語言函數使用。C語言函數要確保不能在任何Go語言的內存中保存該指針。C語言函數返回後也不能再持有傳入的Go語言對象的指針。一個C函數調用的Go函數,或者是一個Go函數調用的C函數都不能返回一個Go語言對象的指針。C語言函數可以返回指向C語言對象的指針(C語言對象內部不能含有Go對象的指針)。雖然C函數不能在返回後繼續持有Go對象的指針,但是Go函數可以在返回後繼續持有C語言對象的指針(C對象內部還是不能含有Go對象的指針)。

以上的指針傳遞規則是有runtime運行時動態檢測的。該檢測行爲可以通過GODEBUG環境變量來控制。默認人值是GODEBUG=cgocheck=1,也就是檢測是開啓的。關閉檢測可以通過設置GODEBUG=cgocheck=0完成。完整的檢測需要設置GODEBUG=cgocheck=2,可能導致一定的性能損失。

當然,通過unsafe包可以打破任何的Go語言規則,不過這是危險的行爲。

具體請參考《Go語言聖經》第十三章 底層編程

Runtime變化

增加了一個輕量級的對map非法併發訪問問題的檢測。當一個goroutine更新一個map時,任何其它的goroutine讀或寫同一個map都將導致程序終止。更嚴格的檢測可以用race來完成。

同時,修復了Windows命令行下,print/println/panic中文亂碼問題。

GC的性能對比

輸入圖片說明

HTTP/2 支持

Go1.6的net/http包增加了對 HTTP/2 標準協議的支持。當Go的客戶端使用HTTPS的時候會默認使用 HTTP2 協議。這裏並沒有針對HTTP2協議改變包的接口。

如果客戶端需要禁止 HTTP2 協議,可以通過將 Transport.TLSNextProto(客戶端) 或 Server.TLSNextProto(服務器) 設置爲非nil的空map實現。

其他

  • Reflect包有更新,可能需要更新相關代碼,具體請參考 Issue12367
  • 模板部分增加了 "{{23 -}} < {{- 45}}"{block "title"}} 語法。
  • Sort包默認將採用不穩定的排序,其中Stable用於穩定排序。
  • 標準庫中其它包的變化

參考鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章