在今年4月,Go官方就預告即將支援Go編譯成WebAssembly,一展取代Javascript的野心,而這個功能就在上周五釋出的最新版本Go中實現了,雖然1.11是個小更新,但除了WebAssembly的支援外,也加入了模組概念,另外還更新了工具鏈、Runtime和函式庫。

Go 1.11新加入了模組的概念,這是整合了版本控制以及套件發布的GOPATH替代方案。使用模組,開發者不再受侷限於GOPATH中工作,版本相依成為外顯資訊並且更加輕量,程式建置也將更可靠,並且具可重複性。目前模組支援仍在實驗階段,存在一些已知的問題正待解決,也會根據使用者的回饋進行改進,因此細節可能發生變化,雖然如此,但官方承諾,在Go 1.11轉換使用模組的專案,將能在Go 1.12或更高版本中繼續運作。

因為Go模組的支援,在命令列中@符號被指派了特殊意義,因此Go命令現在不允許使用包含@符號的導入路徑,由於Go Get本來就無法使用這樣的導入路徑,所以這樣的限制只會影響由其他方法建置客制化GOPATH樹的專案。

在WebAssembly編譯功能支援方面,現在Go 1.11增加了一個WebAssembly實驗性埠口,Go程式現在可以編譯成一個WebAssembly模組,該模組包含goroutine 調度、垃圾回收與Maps等功能的Go Runtime,整體大小約在2MB左右,壓縮後可下降到500KB。Go程式現在可使用新的實驗性syscall/js套件呼叫JavaScript。由於新增了GOOS值js以及GOARCH值wasm,除了那些正在被使用GOOS/GOARCH值外,Go工具現在會忽略名為*_js.go或*_wasm.go的Go檔案。使用者需要重新命名不符合規則的檔案名稱。

Go 1.11的編譯器現在會為最佳化的二進位檔案提供更為精準的除錯資訊,包含變數位置資訊、行數以及中斷點位置,這將能在不使用-N -l的情況下,為編譯的二進位檔除錯,不過這些除錯資訊仍有其限制,有些是根本上的限制,官方提到,將會在未來繼續修正除錯功能。

Runtime更新的部分,現在使用稀疏堆積布局(Sparse Heap Layout),因此堆積將解除之前512GiB的大小限制,而這也解決了Go/C二進位檔或以-race編譯的二進位檔,在少數情況會出現的位置空間衝突錯誤。官方提到,更新到Go 1.11,絕大多數的應用程式效能都會提升,但是很難直接說是哪一個改進造成的,因為Go新版本在程式碼生成以及核心函式庫的最佳化,都是效能提升的推手。

而官方在Go 1.10釋出時,就曾公告支援的作業系統版本將提升,因此Go 1.11現在需要OpenBSD 6.2或更高版本,macOS 10.10 Yosemite或更高版本,以及Windows 7或更高版本,對較舊版本的作業系統將不再支援。


熱門新聞

Advertisement