Go 1.7 發行說明

Go 1.7 簡介

最新的 Go 版本 1.7,釋出於 1.6 之後六個月。其大部分更改都在工具鏈、執行時和庫的實現中。語言規範有一處細微更改。一如既往,此版本保持了 Go 1 的相容性承諾。我們預計幾乎所有 Go 程式都將繼續像以前一樣編譯和執行。

此版本增加了對 IBM LinuxOne 的支援更新了 x86-64 編譯器後端以生成更高效的程式碼;包含了從 x/net 子倉庫提升的 context 包,現在已在標準庫中使用;並在 testing 包中增加了支援,用於建立測試和基準測試的層次結構。此版本還完成了 Go 1.5 中開始的 vendoring 支援,使其成為一項標準功能。

語言變化

此版本對語言有一處微小的更改。關於終止語句的部分澄清道,為了確定語句列表是否以終止語句結尾,“最終非空語句”被視為結尾,這與 gc 和 gccgo 編譯器工具鏈的現有行為相匹配。在早期版本中,定義只提及“最終語句”,使得尾隨空語句的效果至少不明確。go/types 包已更新以在此方面與 gc 和 gccgo 編譯器工具鏈匹配。此更改對現有程式的正確性沒有影響。

移植

Go 1.7 增加了對 macOS 10.12 Sierra 的支援。使用 Go 1.7 之前版本構建的二進位制檔案在 Sierra 上將無法正常工作。

Go 1.7 增加了對 Linux on z Systemslinux/s390x)的實驗性移植,以及對 Plan 9 on ARM(plan9/arm)的初步移植。

Go 1.6 中增加的對 64 位 MIPS 上的 Linux(linux/mips64linux/mips64le)的實驗性移植現在已完全支援 cgo 和外部連結。

對小端 64 位 PowerPC 上的 Linux(linux/ppc64le)的實驗性移植現在需要 POWER8 架構或更高版本。大端 64 位 PowerPC(linux/ppc64)只需要 POWER5 架構。

OpenBSD 移植現在需要 OpenBSD 5.6 或更高版本,才能訪問 getentropy(2) 系統呼叫。

已知問題

FreeBSD 上存在一些已知但不瞭解的不穩定性。這些可能在極少數情況下導致程式崩潰。請參閱問題 16136問題 15658問題 16396。任何有助於解決這些 FreeBSD 特定問題的工作都將不勝感激。

工具

彙編器

對於 64 位 ARM 系統,向量暫存器名稱已更正為 V0V31;以前的版本錯誤地將其稱為 V32V63

對於 64 位 x86 系統,已新增以下指令:PCMPESTRIRORXLRORXQVINSERTI128VPADDDVPADDQVPALIGNRVPBLENDDVPERM2F128VPERM2I128VPORVPSHUFBVPSHUFDVPSLLDVPSLLDQVPSLLQVPSRLDVPSRLDQVPSRLQ

編譯器工具鏈

此版本包含了針對 64 位 x86 系統的新程式碼生成後端,遵循了 2015 年的提案,該提案自那時起一直在開發中。這個基於 SSA 的新後端生成更緊湊、更高效的程式碼,併為邊界檢查消除等最佳化提供了更好的平臺。新後端將我們的基準程式所需的 CPU 時間減少了 5-35%。

在此版本中,可以透過向編譯器傳遞 -ssa=0 來停用新後端。如果您發現您的程式只有在新後端停用後才能成功編譯或執行,請提交錯誤報告

編譯器在包存檔中寫入的匯出元資料格式已更改:舊的文字格式已被更緊湊的二進位制格式取代。這導致包存檔略小,並修復了一些長期存在的邊緣情況錯誤。

在此版本中,可以透過向編譯器傳遞 -newexport=0 來停用新匯出格式。如果您發現您的程式只有在新匯出格式停用後才能成功編譯或執行,請提交錯誤報告

連結器的 -X 選項不再支援不尋常的兩引數形式 -X name value,如 Go 1.6 發行說明和連結器列印的警告中宣佈的那樣。請改用 -X name=value

此版本中編譯器和連結器已進行最佳化,執行速度明顯快於 Go 1.6,儘管它們仍然比我們期望的要慢,並將在未來版本中繼續進行最佳化。

由於編譯器工具鏈和標準庫的更改,此版本構建的二進位制檔案通常應小於 Go 1.6 構建的二進位制檔案,有時甚至可以小 20-30%。

在 x86-64 系統上,Go 程式現在按照 Linux 的 perf 和 Intel 的 VTune 等分析工具的預期維護堆疊幀指標,使得使用這些工具分析和最佳化 Go 程式變得更加容易。幀指標維護會產生一個小的執行時開銷,該開銷因情況而異,但平均約為 2%。我們希望在未來版本中降低此成本。要構建不使用幀指標的工具鏈,請在執行 make.bashmake.batmake.rc 時設定 GOEXPERIMENT=noframepointer

Cgo

使用 cgo 的包現在可以包含 Fortran 原始檔(除了 C、C++、Objective C 和 SWIG),儘管 Go 繫結仍然必須使用 C 語言 API。

Go 繫結現在可以使用新的輔助函式 C.CBytes。與 C.CString 接受 Go string 並返回 *C.byte(C char*)不同,C.CBytes 接受 Go []byte 並返回 unsafe.Pointer(C void*)。

在過去的版本中,由於嵌入了臨時目錄名稱,使用 cgo 構建的包和二進位制檔案在每次構建時都會產生不同的輸出。當此版本與足夠新的 GCC 或 Clang 版本(支援 -fdebug-prefix-map 選項的版本)一起使用時,這些構建最終應該是確定性的。

Gccgo

由於 Go 的半年釋出週期與 GCC 的年度釋出週期保持一致,GCC 版本 6 包含了 gccgo 的 Go 1.6.1 版本。下一個版本 GCC 7 可能會包含 gccgo 的 Go 1.8 版本。

Go 命令

go 命令的基本操作沒有改變,但有許多值得注意的更改。

此版本刪除了對 GO15VENDOREXPERIMENT 環境變數的支援,如 Go 1.6 發行說明中宣佈的那樣。Vendoring 支援現在是 go 命令和工具鏈的標準功能。

提供給“go list”的 Package 資料結構現在包含一個 StaleReason 欄位,解釋了為什麼某個特定包被視為過時(需要重新構建)或不被視為過時。此欄位可用於 -f-json 選項,有助於理解為什麼目標正在被重新構建。

go get”命令現在支援引用 git.openstack.org 的匯入路徑。

此版本增加了對使用僅二進位制包(以二進位制形式分發且不包含相應原始碼的包)構建程式的實驗性、最小支援。此功能在某些商業環境中是必需的,但不打算完全整合到工具鏈的其餘部分。例如,假定可以訪問完整原始碼的工具將無法與此類包一起使用,並且沒有計劃在“go get”命令中支援此類包。

Go doc

go doc”命令現在將建構函式與其構造的型別進行分組,遵循 godoc

Go vet

go vet”命令在其 -copylock-printf 檢查中具有更準確的分析,並新增了一個 -tests 檢查,用於檢查可能的測試函式的名稱和簽名。為了避免與新的 -tests 檢查混淆,舊的、未公開的 -test 選項已被刪除;它等效於 -all -shadow

vet 命令還新增了一個檢查,-lostcancel,它檢測未能呼叫 Go 1.7 新增的 context 包(參見下文)中的 WithCancelWithTimeoutWithDeadline 函式返回的取消函式。未能呼叫該函式會阻止新的 Context 被回收,直到其父上下文被取消。(後臺上下文永遠不會被取消。)

Go tool dist

新的子命令“go tool dist list”列印所有支援的作業系統/架構對。

Go tool trace

go tool trace”命令,在 Go 1.5 中引入,已透過各種方式進行完善。

首先,收集追蹤比過去版本效率顯著提高。在此版本中,收集追蹤的典型執行時間開銷約為 25%;在過去版本中至少為 400%。其次,追蹤檔案現在包含檔案和行號資訊,使其更加自包含,並且在執行追蹤工具時原始可執行檔案變為可選。第三,追蹤工具現在會分解大型追蹤,以避免基於瀏覽器的檢視器中的限制。

儘管此版本中追蹤檔案格式已更改,但 Go 1.7 工具仍然可以讀取早期版本的追蹤。

效能

一如既往,更改如此普遍和多樣,以至於很難對效能做出精確的陳述。由於垃圾收集器的加速和核心庫的最佳化,大多數程式應該執行得稍快一些。在 x86-64 系統上,由於新編譯器後端帶來的生成程式碼的改進,許多程式將執行得顯著更快。如上所述,在我們的基準測試中,僅程式碼生成更改通常就能將程式 CPU 時間減少 5-35%。

crypto/sha1crypto/sha256encoding/binaryfmthash/adler32hash/crc32hash/crc64image/colormath/bigstrconvstringsunicodeunicode/utf16 包中的實現已進行重大最佳化,效能提升超過 10%。

對於具有大量空閒 goroutine、堆疊大小大幅波動或大型包級變數的程式,垃圾收集暫停時間應比 Go 1.6 短得多。

標準庫

Context

Go 1.7 將 golang.org/x/net/context 包作為 context 移入標準庫。這允許在其他標準庫包(包括netnet/httpos/exec)中使用上下文進行取消、超時和傳遞請求範圍的資料,如下所述。

有關上下文的更多資訊,請參閱包文件和 Go 部落格文章“Go 併發模式:Context”。

HTTP 追蹤

Go 1.7 引入了 net/http/httptrace,一個提供追蹤 HTTP 請求中事件機制的包。

測試

testing 包現在支援定義帶有子測試的測試和帶有子基準測試的基準測試。此支援使得編寫表格驅動的基準測試和建立分層測試變得容易。它還提供了一種共享通用設定和拆卸程式碼的方法。有關詳細資訊,請參閱包文件

執行時

執行時啟動的所有 panic 現在都使用實現了內建 errorruntime.Error 的 panic 值,如語言規範所要求

在 panic 期間,如果已知訊號名稱,它將列印在堆疊追蹤中。否則,將使用訊號編號,就像 Go1.7 之前一樣。

新函式 KeepAlive 提供了一種明確的機制,用於宣告一個已分配物件在程式的特定點必須被視為可達,通常是為了延遲相關終結器的執行。

新函式 CallersFrames 將從 Callers 獲取的 PC 切片轉換為與呼叫堆疊對應的幀序列。應優先使用此新 API 而不是直接使用 FuncForPC,因為幀序列可以更準確地描述帶有行內函數呼叫的呼叫堆疊。

新函式 SetCgoTraceback 有助於 Go 和使用 cgo 呼叫的在同一程序中執行的 C 程式碼之間更緊密的整合。

在 32 位系統上,執行時現在可以使用作業系統在地址空間中任意位置分配的記憶體,消除了在某些環境中常見的“OS 分配的記憶體不在可用範圍內”的故障。

執行時現在可以在所有架構上將未使用的記憶體返回給作業系統。在 Go 1.6 及更早版本中,執行時無法在 ARM64、64 位 PowerPC 或 MIPS 上釋放記憶體。

在 Windows 上,Go 1.5 及更早版本中的 Go 程式透過呼叫 timeBeginPeriod(1) 在啟動時將全域性 Windows 計時器解析度強制設定為 1ms。更改全域性計時器解析度在某些系統上導致問題,並且測試表明不需要此呼叫以獲得良好的排程程式效能,因此 Go 1.6 刪除了此呼叫。Go 1.7 重新引入了此呼叫:在某些工作負載下,此呼叫仍然是良好排程程式效能所必需的。

對庫的微小更改

與往常一樣,庫中有各種微小的更改和更新,這些都是在遵守 Go 1 相容性承諾的前提下進行的。

bufio

在 Go 的早期版本中,如果 ReaderPeek 方法請求的位元組數超過底層緩衝區可容納的位元組數,它將返回一個空切片和錯誤 ErrBufferFull。現在它返回整個底層緩衝區,仍然伴隨著錯誤 ErrBufferFull

bytes

新增了 ContainsAnyContainsRune 函式,以與 strings 包對稱。

在 Go 的早期版本中,如果 ReaderRead 方法在沒有剩餘資料的情況下請求零位元組,它將返回計數 0 且沒有錯誤。現在它返回計數 0 和錯誤 io.EOF

Reader 型別新增了一個方法 Reset,以允許重用 Reader

compress/flate

整個包中有許多效能最佳化。解壓速度提高了約 10%,而 DefaultCompression 的壓縮速度是原來的兩倍。

除了這些通用改進之外,BestSpeed 壓縮器已完全替換,並使用類似於 Snappy 的演算法,導致速度提高了約 2.5 倍,儘管輸出可能比以前的演算法大 5-10%。

還新增了一個壓縮級別 HuffmanOnly,它只應用霍夫曼編碼而不應用 Lempel-Ziv 編碼。放棄 Lempel-Ziv 編碼意味著 HuffmanOnly 的執行速度比新的 BestSpeed 快約 3 倍,但代價是生成比新的 BestSpeed 大 20-40% 的壓縮輸出。

重要的是要注意,BestSpeedHuffmanOnly 都生成符合 RFC 1951 的壓縮輸出。換句話說,任何有效的 DEFLATE 解壓器都將能夠繼續解壓這些輸出。

最後,解壓器對 io.Reader 的實現有一個細微更改。在以前的版本中,解壓器會推遲報告 io.EOF,直到恰好無法讀取更多位元組。現在,它在讀取最後一組位元組時更積極地報告 io.EOF

crypto/tls

TLS 實現對每個連線傳送的前幾個資料包使用較小的記錄大小,逐漸增加到 TLS 最大記錄大小。這種啟發式方法減少了在解密第一個資料包之前必須接收的資料量,從而改善了低頻寬網路上的通訊延遲。將 ConfigDynamicRecordSizingDisabled 欄位設定為 true 會強制 Go 1.6 及更早版本的行為,即從連線開始時資料包就儘可能大。

TLS 客戶端現在可選地、有限地支援伺服器發起的重新協商,透過設定 ConfigRenegotiation 欄位啟用。這是連線到許多 Microsoft Azure 伺服器所必需的。

包返回的錯誤現在始終以 tls: 字首開頭。在過去的版本中,一些錯誤使用 crypto/tls: 字首,一些使用 tls: 字首,還有一些完全沒有字首。

生成自簽名證書時,包預設不再設定“Authority Key Identifier”欄位。

crypto/x509

新函式 SystemCertPool 在可用時提供對整個系統證書池的訪問。還有一個新的相關錯誤型別 SystemRootsError

debug/dwarf

Reader 型別的新方法 SeekPCData 型別的新方法 Ranges 有助於查詢要傳遞給 LineReader 的編譯單元,並識別給定程式計數器的特定函式。

debug/elf

新的 R_390 重定位型別及其許多預定義常量支援 S390 埠。

encoding/asn1

ASN.1 解碼器現在拒絕非最小整數編碼。這可能導致包拒絕一些無效但以前接受的 ASN.1 資料。

encoding/json

Encoder 的新方法 SetIndent 設定 JSON 編碼的縮排引數,就像頂層 Indent 函式一樣。

Encoder 的新方法 SetEscapeHTML 控制帶引號字串中的 &<> 字元是否應分別轉義為 \u0026\u003c\u003e。與以前的版本一樣,編碼器預設應用此轉義,以避免在將 JSON 嵌入 HTML 時可能出現的一些問題。

在 Go 的早期版本中,此包僅支援使用字串型別鍵的對映的編碼和解碼。Go 1.7 增加了對使用整數型別鍵的對映的支援:編碼使用帶引號的十進位制表示作為 JSON 鍵。Go 1.7 還增加了對使用實現 MarshalText(參見 encoding.TextMarshaler)方法的非字串鍵的對映的編碼支援,以及對使用實現 UnmarshalText(參見 encoding.TextUnmarshaler)方法的非字串鍵的對映的解碼支援。對於字串型別鍵,這些方法會被忽略,以保留 Go 早期版本中使用的編碼和解碼。

編碼型別化位元組切片時,Marshal 現在會生成一個元素陣列,使用該位元組型別的 MarshalJSONMarshalText 方法(如果存在)進行編碼,僅當兩種方法都不可用時才回退到預設的 base64 編碼字串資料。Go 的早期版本接受原始的 base64 編碼字串編碼和陣列編碼(假設位元組型別也相應實現了 UnmarshalJSONUnmarshalText),因此此更改在語義上應與 Go 的早期版本向後相容,儘管它確實更改了所選的編碼。

go/build

為了實現 go 命令對僅二進位制包和 cgo 包中 Fortran 程式碼的新支援,Package 型別添加了新的欄位 BinaryOnlyCgoFFLAGSFFiles

go/doc

為了支援上面描述的 go test 中的相應更改,Example 結構添加了一個 Unordered 欄位,指示示例是否可以按任意順序生成其輸出行。

io

包添加了新的常量 SeekStartSeekCurrentSeekEnd,用於 Seeker 實現。這些常量優於 os.SEEK_SETos.SEEK_CURos.SEEK_END,但後者將為相容性而保留。

math/big

Float 型別添加了 GobEncodeGobDecode 方法,因此 Float 型別的值現在可以使用 encoding/gob 包進行編碼和解碼。

math/rand

Read 函式和 RandRead 方法現在生成一個一致且不依賴於輸入緩衝區大小的偽隨機位元組流。

文件澄清了 Rand 的 SeedRead 方法不能併發呼叫,儘管全域性函式 SeedRead 是(並且一直都是)安全的。

mime/multipart

Writer 實現現在按鍵對每個多部分部分的頭部進行排序。以前,迭代對映會導致部分頭部的順序不確定。

net

作為 context 引入的一部分,Dialer 型別新增了一個方法 DialContext,它類似於 Dial,但為撥號操作添加了 context.Context。上下文旨在取代 DialerCancelDeadline 欄位,但為了向後相容性,實現仍然尊重它們。

IP 型別的 String 方法對無效 IP 地址的結果已更改。在過去版本中,如果 IP 位元組切片的長度不是 0、4 或 16,String 會返回 "?"。Go 1.7 增加了位元組的十六進位制編碼,例如 "?12ab"

純 Go 名稱解析實現現在尊重 nsswitch.conf 中關於 DNS 查詢與本地檔案(即 /etc/hosts)查詢優先順序的宣告。

net/http

ResponseWriter 的文件現在明確指出,開始寫入響應可能會阻止將來讀取請求正文。為了最大限度地相容,建議實現在寫入響應的任何部分之前完整讀取請求正文。

作為 context 引入的一部分,Request 增加了新的方法 Context 用於檢索相關上下文,以及 WithContext 用於構造一個帶有修改上下文的 Request 副本。

Server 實現中,Serve 在請求上下文中記錄了底層 *Server(使用鍵 ServerContextKey)和接收請求的本地地址(一個 Addr)(使用鍵 LocalAddrContextKey)。例如,接收請求的地址是 req.Context().Value(http.LocalAddrContextKey).(net.Addr)

伺服器的 Serve 方法現在僅在 Server.TLSConfig 欄位為 nil 或其 TLSConfig.NextProtos 中包含 "h2" 時才啟用 HTTP/2 支援。

伺服器實現現在按照協議要求將小於 100 的響應碼填充為三位數,因此 w.WriteHeader(5) 使用 HTTP 響應狀態 005,而不僅僅是 5

伺服器實現現在在顯式設定“chunked”時,根據 RFC 7230,正確地只發送一個“Transfer-Encoding”頭。

伺服器實現現在對於拒絕帶有無效 HTTP 版本的請求更加嚴格。聲稱是 HTTP/0.x 的無效請求現在被拒絕(HTTP/0.9 從未完全支援),並且除“PRI * HTTP/2.0”升級請求之外的明文 HTTP/2 請求現在也被拒絕。伺服器繼續處理加密的 HTTP/2 請求。

在伺服器中,當響應正文為空時,超時處理程式會返回 200 狀態碼,而不是返回 0 作為狀態碼。

在客戶端中,Transport 實現將請求上下文傳遞給連線到遠端伺服器的任何撥號操作。如果需要自定義撥號器,新的 Transport 欄位 DialContext 優於現有的 Dial 欄位,以便傳輸可以提供上下文。

Transport 還增加了 IdleConnTimeoutMaxIdleConnsMaxResponseHeaderBytes 欄位,以幫助控制空閒或多話伺服器消耗的客戶端資源。

Client 配置的 CheckRedirect 函式現在可以返回 ErrUseLastResponse,表示應將最近的重定向響應作為 HTTP 請求的結果返回。該響應現在可以透過 req.Response 提供給 CheckRedirect 函式。

自 Go 1 以來,HTTP 客戶端的預設行為是使用 Accept-Encoding 請求頭請求伺服器端壓縮,然後透明地解壓響應體,此行為可透過 TransportDisableCompression 欄位進行調整。在 Go 1.7 中,為了輔助 HTTP 代理的實現,Response 的新欄位 Uncompressed 報告是否發生了透明解壓。

DetectContentType 增加了對幾種新的音訊和影片內容型別的支援。

net/http/cgi

Handler 增加了一個新欄位 Stderr,允許將子程序的標準錯誤重定向到主機程序的標準錯誤之外。

net/http/httptest

新函式 NewRequest 準備一個新的 http.Request,適合在測試期間傳遞給 http.Handler

ResponseRecorder 的新方法 Result 返回記錄的 http.Response。需要檢查響應的頭部或尾部的測試應呼叫 Result 並檢查響應欄位,而不是直接訪問 ResponseRecorderHeaderMap

net/http/httputil

ReverseProxy 實現現在在無法連線到後端時返回“502 Bad Gateway”;在早期版本中,它返回“500 Internal Server Error”。

ClientConnServerConn 都已記錄為已棄用。它們是低階的、舊的、Go 當前 HTTP 堆疊未使用的,並且將不再更新。程式應改用 http.Clienthttp.Transporthttp.Server

net/http/pprof

執行時追蹤 HTTP 處理程式(安裝用於處理路徑 /debug/pprof/trace)現在在其 seconds 查詢引數中接受小數,允許收集小於一秒的追蹤。這在繁忙的伺服器上特別有用。

net/mail

地址解析器現在允許地址中包含未轉義的 UTF-8 文字,遵循 RFC 6532,但它不對結果應用任何規範化。為了與舊的郵件解析器相容,地址編碼器,即 AddressString 方法,繼續按照 RFC 5322 轉義所有 UTF-8 文字。

ParseAddress 函式和 AddressParser.Parse 方法現在更加嚴格。它們以前會忽略電子郵件地址後面的任何字元,但現在會返回除空白字元以外的任何內容的錯誤。

net/url

URL 的新欄位 ForceQuery 記錄 URL 是否必須包含查詢字串,以區分沒有查詢字串的 URL(如 /search)和包含空查詢字串的 URL(如 /search?)。

os

在存在 syscall.ENOTEMPTY 錯誤的系統上,IsExist 現在對 syscall.ENOTEMPTY 返回 true。

在 Windows 上,Remove 現在在可能的情況下會刪除只讀檔案,使實現行為與非 Windows 系統一致。

os/exec

作為 context 引入的一部分,新的建構函式 CommandContext 類似於 Command,但包含一個可用於取消命令執行的上下文。

os/user

即使 cgo 不可用,Current 函式現在也已實現。

新的 Group 型別,以及查詢函式 LookupGroupLookupGroupId,以及 User 結構體中的新欄位 GroupIds,提供對系統特定使用者組資訊的訪問。

reflect

儘管 ValueField 方法一直被文件記錄為如果給定的欄位編號 i 超出範圍就會 panic,但它反而默默地返回了一個零 Value。Go 1.7 更改了該方法的行為,使其符合文件。

新的 StructOf 函式在執行時構造結構型別。它完善了型別建構函式集,加入了 ArrayOfChanOfFuncOfMapOfPtrToSliceOf

StructTag 的新方法 Lookup 類似於 Get,但它區分不包含給定鍵的標籤與將空字串與給定鍵關聯的標籤。

TypeValueMethodNumMethod 方法不再返回或計算未匯出的方法。

strings

在 Go 的早期版本中,如果 ReaderRead 方法在沒有剩餘資料的情況下請求零位元組,它將返回計數 0 且沒有錯誤。現在它返回計數 0 和錯誤 io.EOF

Reader 型別新增了一個方法 Reset,以允許重用 Reader

time

Duration 的 time.Duration.String 方法現在將零持續時間報告為 "0s",而不是 "0"ParseDuration 繼續接受這兩種形式。

方法呼叫 time.Local.String() 現在在所有系統上都返回 "Local";在早期版本中,它在 Windows 上返回一個空字串。

$GOROOT/lib/time 中的時區資料庫已更新到 IANA 2016d 版本。此備用資料庫僅在找不到系統時區資料庫時使用,例如在 Windows 上。Windows 時區縮寫列表也已更新。

syscall

在 Linux 上,SysProcAttr 結構體(如在 os/exec.CmdSysProcAttr 欄位中使用)新增了一個 Unshareflags 欄位。如果該欄位非零,則由 ForkExec(如在 exec.CmdRun 方法中使用)建立的子程序將在執行新程式之前呼叫 unshare(2) 系統呼叫。

unicode

unicode 包和整個系統中的相關支援已從版本 8.0 升級到 Unicode 9.0