Go1.2新功能簡介

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

距離2013.08.12正式發布Go1.1.2大約1個月了.
目前Go語言已經進入Go1.2的發布流程, 預計將在2013年底發布.

本文主要列舉Go1.2的一些大的改進, 並會持續保持更新.

語言的改變

禁止nil對象取值

對於Go1.0, 有以下代碼:

?

1 2 3 4 5 6 7 8 type T struct {     X [1<<24]byte     Field int32 }   func main() {     var x *T }

操作 x.Field 將會對應到 1<<24 位置的記憶體.
在Go1.2中, 將導致 panic 或 錯誤.

切片文法增加cap域

之前在切片時, cap預設為最大.
比如:

?

1 2 var array [10]int slice := array[2:4]

slice的容量是8. 在Go1.2中, 如希望容量為6, 可以這樣:

?

1 slice = array[2:4:6]

如果第一部分的開始地址省略, 則預設為0.

有了可定製的cap文法,就可以自己new一個大記憶體,然後自己構造malloc/free記憶體管理函數了。

每次malloc返回的slice的cap被嚴格限定為申請的size。

該文法的設計文檔: https://docs.google.com/document/d/1GKKdiGYAghXRxC2BFrSEbHBZZgAGKQ-yXK-hRKBo0Kk/pub

cgo支援C++源碼

CGO支援函數指標, 用法請參考 https://code.google.com/p/go/source/browse/misc/cgo/test/fpvar.go.

CGO支援C++文法, 但是只支援C語言的匯入符號.

針對C++增加了 CPPFLAGSCXXFLAGS 參數設定選項.

比較適合用C語言匯出, 但是用C++實現的庫.

注: windows版本的MinGW還不支援外部連結, 詳情請參考 Issue6533.

runtime實現的變化

goroutines 的函數入口採用搶佔式調度.

在之前的版本中, 如果goroutines內部有死迴圈,
那麼其他的 goroutines 可能無法擷取此線程的CPU資源,
特別是在 GOMAXPROCS 設定為 1 個線程的時候.

在Go1.2中部分解決了此問題: 調度器會在函數的
入口處被偶爾觸發. 也就是說, 如果任何迴圈
內部調用了一個非內聯的函數的話, 其他goroutines
也將有機會在同一個線程執行.

在Go1.2, goroutine 的預設堆棧大小臨時由4KB改為8KB.
新改的8KB大小對於很多實際的程式可以帶來一定的效能提升.
當然, 更大的預設堆棧也導致了程式可能使用更多的記憶體,
在後續的Go開發中採用更好的堆棧技術解決這個問題.

同時goroutine的棧有最大限制(不是無限的), 64位系統預設限制為1GB,
32位系統模型限制為250MB.
如果需要調整預設值, 可以調用 runtime/debug 包的 SetMaxStack 函數修改.
具體請參考: CL12541052

程式開啟的系統線程有增加了最大數量限制(預設為10000).
如果需要調整預設值, 可以調用 runtime/debug 包的 SetMaxThreads 函數修改.
具體請參考: CL13037043

關於動態庫支援

Linux/Arm 版本已經支援外部連結.
這是Go的編譯工具鏈支援動態庫特性的一個關鍵環節.

gccgo的狀態

期望GCC4.9能包含完整的Go1.2. 目前的GCC4.8.2包含Go1.1.2.

效能最佳化

  • compress/bzip2: 30%的效能提升

  • crypto/des: 5倍的效能提升

  • encoding/json: encoding 30% 的效能提升

  • net: windows/BSD下 網路和 runtime 的深度整合(Linux/OS X在Go1.1已經支援), 30% 的效能提升

標準庫的變化

較大的變化有:

  • encoding: 新包, 提供通用的 encoding 介面

  • fmt: 引入參數索引支援, 主要是處理不同語言翻譯之後參數順序的變化

  • sync/atomic: 增加了 Swap 函數

  • text/template: 增加 eq/lt 等比較函數, 增加 {{else if ... }}簡化文法

  • runtime: 簡化 SetFinalizer 參數 f 的參數類型的限制, 只要可賦值即可

  • testing: 增加的 TB 介面

  • image/gif 增加了 encode 函數

  • MD5/HASH等增加便利的函數

fmt新支援的參數索引:

?

1 2 fmt.Printf("%[3]c %[1]c %[1]c %c\n", 'a', 'b', 'c') // output: c a a b

簡化的HASH用法:

?

1 2 hash := sha1.Sum([]byte("123")) fmt.Printf("H(data) = %x\n", hash)

雜項訊息(個人補充)

  • go 命令列工具遷移到 go.tools, 並將大幅改進版面

  • go.text/encoding 增加了 GBK 的支援, 徹底解決中文Windows命令列中文亂碼問題.

  • go.image 增加了 bmp 的儲存 和 分塊 tiff 的讀取支援, 目前還不支援超大tiff映像.

  • notepad++ 更好的高亮顯示, builtin函數的自動補全, 函數/方法列表等功能.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.