Go 1.7 發行說明
Go 1.7 簡介
最新版本的 Go 1.7 已在 1.6 發行後的六個月後推出。大部分更動在於工具鏈、執行時間和函式庫的實作。語言規格中有一個小變更。一如往常,此版本依舊維持 Go 1 相容性承諾。我們預期幾乎所有的 Go 程式在編譯和執行上都能像以前一樣。
此次發行 新增支援 IBM LinuxOne;更新 x86-64 編譯器後端 以產生更有效率的程式碼;納入 context 套件,是從 x/net 子儲存庫 提升上來,現在使用在標準函式庫中;以及 在 testing 套件中新增支援 以建立測試和基準的層級架構。此版本也 完成在 Go 1.5 中開始的供應商相依性支援,使其成為一項標準功能。
語言變更
本版本只做了一處細微的語言更動。有關終止陳述式的部分,說明為了判斷陳述式清單是否結束於終止陳述式,會視「最後一個非空白陳述式」為結尾,這與現行 gc 與 gccgo 編譯器工具鏈的行為一致。在更早的版本,定義只說明「最後一個陳述式」,讓尾隨的空白陳述式所造成的後果甚不明確。關於這點,go/types
套件已更新,以符合 gc 與 gccgo 編譯器工具鏈。此變更不會影響現有程式正確性。
各種移植
Go 1.7 支援 macOS 10.12 Sierra。使用 1.7 之前版本的 Go 建置的二進位檔將無法於 Sierra 上正常運作。
Go 1.7 新增試驗性的移植,支援Linux 於 z Systems(linux/s390x
),以及著手進行於 ARM 上使用 Plan 9 的移植(plan9/arm
)。
在 Go 1.6 新增的 Linux 於 64 位元 MIPS 的試驗性質移植(linux/mips64
與 linux/mips64le
)已能完全支援 cgo 與外連。
Linux 於小端序 64 位元 PowerPC 的試驗性質移植(linux/ppc64le
)現在需要 POWER8 或更新的架構。大端序 64 位元 PowerPC(linux/ppc64
)只需要 POWER5 架構。
OpenBSD 移植現在需要 OpenBSD 5.6 或更新版本,以便存取getentropy(2) 函式。
已知問題
已知 FreeBSD 存在某些目前尚不了解的不穩定問題。這些問題在罕見情況下會導致程式崩潰。請參閱問題 16136、問題 15658和問題 16396。協助解決這些 FreeBSD 特有的問題,我們將不勝感激。
工具
組譯器
對於 64 位元 ARM 系統,向量暫存器名稱已修正為 V0
到 V31
;先前版本錯誤地將其稱為 V32
到 V63
。
對於 64 位元 x86 系統,已新增以下指令:PCMPESTRI
、RORXL
、RORXQ
、VINSERTI128
、VPADDD
、VPADDQ
、VPALIGNR
、VPBLENDD
、VPERM2F128
、VPERM2I128
、VPOR
、VPSHUFB
、VPSHUFD
、VPSLLD
、VPSLLDQ
、VPSLLQ
、VPSRLD
、VPSRLDQ
和VPSRLQ
。
編譯器工具鏈
此版本包含新的 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.bash
、make.bat
或 make.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 包含有 Go 1.6.1 版本的 gccgo。下個版本 GCC 7 可能會有 Go 1.8 版本的 gccgo。
Go 指令
go
指令的基本操作保持不變,但仍有一些值得注意的變更。
此版本取消支援 GO15VENDOREXPERIMENT
環境變數,就像在 Go 1.6 版本所 宣布 的一樣。供應商支援 現在是 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
套件中 WithCancel
、WithTimeout
和 WithDeadline
函式所傳回的取消函式(請參閱下方)。如果沒有呼叫函式,就會導致新的 Context
無法回收,除非它的父項被取消。(背景內容永遠不會被取消。)
Go tool dist
新的子指令「go
tool
dist
list
」會列印出所有支援的操作系統/架構配對。
Go tool trace
「go
tool
trace
」指令,在 Go 1.5 中引入,已在各方面得到改善。
首先,收集 trace 比過去的版本有顯著的效率提升。在這個版本中,收集 trace 所造成的典型執行時間開銷為 25%;而過去版本至少需要 400%。其次,trace 檔案現在包含檔案和行號資訊,使它們更能獨立存在,且在執行 trace 工具時,執行檔不再是必要的。第三,trace 工具現在會將大型 trace 分成更小份,以避免基於瀏覽器的檢視器中的限制。
儘管此版本中 trace 檔案格式有變更,但 Go 1.7 工具仍可讀取較早期版本中的 trace。
效能
一如往常,變更相當廣泛且多樣,因此很難對效能做出精確的聲明。大部分程式應會執行得更快,因為垃圾回收裝置有了提升,核心函式庫也進行了最佳化。在 x86-64 系統上,由於新編譯器的後端程式碼產生有改善,許多程式執行速度也會有顯著的提升。如上所述,根據我們自己的基準,僅程式碼產生方面的變更平均就能將程式 CPU 時間減少 5-35%。
以下套件中有大量的最佳化,效能提升超過 10%:crypto/sha1
、crypto/sha256
、encoding/binary
、fmt
、hash/adler32
、hash/crc32
、hash/crc64
、image/color
、math/big
、strconv
、strings
、unicode
和 unicode/utf16
。
對於在 Go 1.6 中有大量閒置的 goroutine、大量的堆疊大小變動,或大量的套件級別變數的程式而言,垃圾回收暫停時間應該會比 Go 1.6 明顯減少。
標準函式庫
背景
Go 1.7 將 golang.org/x/net/context
套件移入標準函式庫中,稱為 context
。這使得在其他標準函式庫套件中使用背景進行取消、逾時以及傳遞請求範圍資料成為可能,包括 net、net/http 和 os/exec,如下所述。
如需進一步瞭解背景,請參閱 套件文件 和 Go 部落格文章「並行的 Go 模式:背景」。
HTTP 追蹤
Go 1.7 推出 net/http/httptrace
,這是一個套件,提供在 HTTP 要求內追蹤事件的機制。
測試
testing
套件現在支援定義帶有子測試和帶有子基準的測試。此支援讓撰寫表狀基準以及建立階層式測試變得簡單。它也提供一個方式供共用設定和終止程式碼。請參閱 套件文件 以取得更多詳細資料。
執行時間
現在由執行階段啟動的所有恐慌都會使用同時實作內建 error
和 runtime.Error
的恐慌值,如同 語言規格 所要求的。
在恐慌期間,如果已知訊號名稱,它會印在堆疊追蹤中。否則,會使用訊號號碼,就像 Go1.7 以前一樣。
新函式 KeepAlive
提供明確的機制,宣告已配置的物件在程式中的特定點必須視為可到達,通常會延後執行關聯的完成函式。
新函式 CallersFrames
會將從 Callers
取得的電腦(PC)區段轉換成與呼叫堆疊對應的一組框架。這個新的 API 應優先於直接使用 FuncForPC
,因為框架序列可以更精確地描述包含內聯函數呼叫的呼叫堆疊。
新函式 SetCgoTraceback
可促進使用 cgo 呼叫但在同一程序中執行的 Go 和 C 程式碼之間更緊密的整合。
在 32 位元系統上,執行階段現在可以在位址空間的任何位置使用由作業系統配置的記憶體,消除了某些環境中常見的「由作業系統配置的記憶體未在可用範圍內」失敗。
執行階段現在能在所有架構上將未使用的記憶體傳回作業系統。在 Go 1.6 及更舊版本中,執行階段無法在 ARM64、64 位元 PowerPC 或 MIPS 上釋放記憶體。
在 Windows 上,Go 1.5 及更舊版本的 Go 程式會透過呼叫 timeBeginPeriod(1)
在啟動時將 Windows 全域計時器解析度強制設為 1 毫秒。變更全域計時器解析度會在某些系統上造成問題,測試表明此呼叫並非為良好的排程器效能所必需,因此 Go 1.6 移除了此呼叫。Go 1.7 重新加入呼叫:在某些工作負載下,此呼叫仍然是良好的排程器效能所必需的。
函式庫的輕微變更
如同往常一樣,有針對函式庫做出各種輕微的變更和更新,並考量 Go 1 相容性承諾。
bufio
在先前的 Go 發行版中,如果要求 Reader
的 Peek
方法提供比基礎緩衝區中更多的位元組,它會傳回一個空切片和錯誤 ErrBufferFull
。現在它會傳回整個基礎緩衝區,並伴隨著錯誤 ErrBufferFull
。
bytes
已新增新的函數 ContainsAny
和 ContainsRune
,以與 strings
套件保持一致性。
在 Go 的先前版本中,如果 Reader
的 Read
方法在沒有剩餘資料的情況下被要求提供零個位元組,它會傳回 0 的計數和沒有錯誤。而現在則會傳回 0 的計數和 io.EOF
錯誤。
Reader
類型有一個新的方法 Reset
,以允許重新使用 Reader
。
compress/flate
已針對整個套件進行許多效能最佳化。解壓縮速度提升了約 10%,而 DefaultCompression
的壓縮則是提升了一倍。
除了這些一般性改善之外,BestSpeed
壓縮器已完全取代,並使用與 Snappy 類似的演算法,讓速度提升了約 2.5 倍,儘管輸出的結果可能比先前的演算法大 5-10%。
還新增了一個新的壓縮層級 HuffmanOnly
,它套用了 Huffman 但不套用 Lempel-Ziv 編碼。放棄套用 Lempel-Ziv 編碼 代表 HuffmanOnly
執行的速度比新的 BestSpeed
快約 3 倍,但代價是所產生的壓縮輸出比新的 BestSpeed
大 20-40%。
請注意,BestSpeed
和 HuffmanOnly
均會產生符合 RFC 1951 的壓縮輸出。換句話說,任何有效的 DEFLATE 解壓縮器將可繼續解壓縮這些輸出。
最後,解壓縮器的 io.Reader
實作有一些小幅的變更。在先前版本中,解壓縮器會延後回報 io.EOF
,直到完全無法再讀取更多位元組。而現在,它會在讀取最後一組位元組時更熱切的回報 io.EOF
。
crypto/tls
TLS 實作會在每項連線傳送第一幾個資料封包時,使用較小的記錄大小,逐漸增加至 TLS 最大記錄大小。這種經驗法則可減少在解密第一個封包之前必須接收的資料量,改善低頻寬網路上的通訊延遲。將 Config
的 DynamicRecordSizingDisabled
欄位設定為 true,即可套用 Go 1.6 及早期的行為,也就是在連線一開始,封包就盡可能地大。
TLS 伺服器現在支援任選的伺服器發動的重新協商功能,只要設定 Config
的 Renegotiation
欄位即可啟用。連上許多 Microsoft Azure 伺服器時,需要這麼做。
封包傳回的錯誤現在都以 tls:
字首作為開頭。在過去的版本中,有些錯誤使用 crypto/tls:
字首,有些使用 tls:
字首,有些則完全沒有字首。
產生自簽憑證時,封裝不再預設設定「授權金鑰識別碼」欄位。
crypto/x509
新的函數 SystemCertPool
提供存取整個系統憑證池的權限(如果適用)。還有一種新的相關錯誤類型 SystemRootsError
。
debug/dwarf
Reader
型別新的 SeekPC
方法及 Data
型別新的 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
現在會產生使用該位元組類型 MarshalJSON
或 MarshalText
方法 (若有) 編碼的元素陣列,只有在兩種方法均不可用時才會採用預設 base64 編碼字串資料。早期版本的 Go 接受原始 base64 編碼字串編碼和陣列編碼 (假設位元組類型也會適當地實作 UnmarshalJSON
或 UnmarshalText
),因此此變更應與早期版本的 Go 在語意後向相容性方面相符,即使它會變更已選取的編碼。
go/build
若要實作 go 指令對僅限二進位套件的新支援和對 cgo 基礎套件中 Fortran 程式碼的新支援,Package
類型新增新的欄位 BinaryOnly
、CgoFFLAGS
和 FFiles
。
go/doc
若要支援上面所述在 go test
中做出的對應變更,Example
結構新增 Unordered
欄位,表示範例是否可以任意順序產生其輸出列。
io
此套件新增了新的常數 SeekStart
、SeekCurrent
和 SeekEnd
,供搭配 Seeker
實作使用。這些常數優先於 os.SEEK_SET
、os.SEEK_CUR
和 os.SEEK_END
,但後者將為了相容性而保留。
math/big
Float
類型新增 GobEncode
和 GobDecode
方法,因此現在可以使用 encoding/gob
套件對 Float
類型的值進行編碼和解碼。
math/rand
Read
函式和 Rand
的 Read
方法現在會產生相符且與輸入緩衝區的大小無關的偽隨機位元組串流。
說明文件中說明,Seed
和 Read
Rand 方法不能同步呼叫,不過全域函式 Seed
和 Read
可以同步呼叫 (且一直都是可以同步呼叫)。
mime/multipart
Writer
實作現在依據金鑰對每個 multipart 區段的標頭進行排序。先前的對應迭代會導致區段標頭使用非決定性排序。
net
作為 context 導入的一部分,Dialer
類型有一個新的方法 DialContext
,類似於 Dial
,但針對撥號操作增加了 context.Context
。此內容旨在淘汰 Dialer
的 Cancel
和 Deadline
欄位,但實作會繼續維護這些欄位以維持向後相容性。
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
會在請求內容中記錄使用「ServerContextKey」金鑰的基礎 *Server
,以及請求接收的本機位址(Addr
),使用「LocalAddrContextKey」金鑰記錄。例如,請求接收的位址為 req.Context().Value(http.LocalAddrContextKey).(net.Addr)
。
伺服器 的 Serve
方法現在僅在 Server.TLSConfig
欄位為 nil
或包含 "h2"
在其 TLSConfig.NextProtos
中時,才啟用 HTTP/2 支援。
伺服器實作現在會根據協定需求將低於 100 的回應碼補齊為三位數,這樣 w.WriteHeader(5)
會使用 HTTP 回應狀態 005
,而不是只有 5
。
伺服器實作現在根據 RFC 7230 的明確設定後,僅傳送一個「Transfer-Encoding」標頭,且「chunked」設為明確。
伺服器實作現在較為嚴格地拒絕包含無效 HTTP 版本的要求。宣稱是 HTTP/0.x 的無效要求現在會被拒絕(HTTP/0.9 從未完全支援),而除了「PRI * HTTP/2.0」升級要求之外的純文字 HTTP/2 要求現在也被拒絕。伺服器會繼續處理加密的 HTTP/2 要求。
在伺服器中,200 狀態碼會在空回應本體上由逾時處理常式傳回,而非傳回 0 作為狀態碼。
在用戶端中,Transport
實作會將要求內容傳遞給任何連線至遠端伺服器的撥接操作。如果需要自訂呼叫器,新的 Transport
欄位 DialContext
較現有的 Dial
欄位更為優先,以讓傳輸提供內容。
Transport
也加入了欄位 IdleConnTimeout
、MaxIdleConns
和 MaxResponseHeaderBytes
,以協助控制空閒或傳輸量大的伺服器消耗的用戶端資源。
Client
設定的 CheckRedirect
函式現在可以傳回 ErrUseLastResponse
來指出最近的重新導向回應應該傳回作為 HTTP 要求的結果。現在回應會作為 req.Response
提供給 CheckRedirect
函式。
自 Go 1 起,HTTP 用戶端預設的行為會使用 Accept-Encoding
要求標頭要求伺服器側壓縮,然後透明地解壓縮回應本體,這個行為可以使用 Transport
的 DisableCompression
欄位調整。在 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
並檢查回應欄位,而不是直接存取 ResponseRecorder
的 HeaderMap
。
net/http/httputil
當 ReverseProxy
無法連線到後端時,現在會回應「502 Bad Gateway」;在較早的版本中,則會回應「500 Internal Server Error」。
ClientConn
和 ServerConn
現在都已記錄為已棄用。它們是低階、舊的,且未用於 Go 目前的 HTTP 堆疊中,且不再會更新。程式應使用 http.Client
、http.Transport
和 http.Server
來代替。
net/http/pprof
執行時期追蹤 HTTP 處理常式,已安裝為處理路徑 /debug/pprof/trace
,現在會在查詢參數 seconds
中接受小數,可針對小於 1 秒時間區間收集追蹤。這在忙碌的伺服器上特別有用。
net/mail
地址分析器現在允許地址中使用未跳脫的 UTF-8 文字,這遵循 RFC 6532,但未對結果套用任何正規化。為了能相容舊郵件分析器,地址編碼器,也就是 Address
的 String
方法,會繼續跳脫所有遵循 RFC 5322 的 UTF-8 文字。
ParseAddress
函式和 AddressParser.Parse
方法會更嚴格。它們過去會忽略電子郵件地址後面的任何字元,但現在會對空白以外的任何字元回傳錯誤。
net/url
URL
的新 ForceQuery
欄位會記錄網址必須包含查詢字串,以區分沒有查詢字串 (例如 /search
) 的網址和查詢字串為空白 (例如 /search?
) 的網址。
os
IsExist
現在會對 syscall.ENOTEMPTY
回傳 true,針對存在該錯誤的系統。
在 Windows 上,Remove
現在可能會移除唯讀檔案,使實作的行為與非 Windows 系統上相同。
os/exec
在導入 語境 的一部分,新建構函式 CommandContext
類似於 Command
,但附有可用于取消指令執行的語境。
os/user
現在,即使無法使用 cgo,也能實作 Current
函式。
新的 Group
類型,連同查詢函式 LookupGroup
和 LookupGroupId
,以及 User
struct 中的新欄位 GroupIds
,提供對特定系統使用者群組資訊的存取權限。
reflect
雖然 Value
的 Field
方法一直有說明文件,指出如果給定的欄位數目 i
超出範圍,將會發生恐慌,但它反而靜默地傳回一個零值 Value
。Go 1.7 會將方法變更為符合說明文件中的行為。
新的 StructOf
函式會在執行階段建構一個 struct 類型。它會完成類型建構函式的組成,加入 ArrayOf
、ChanOf
、FuncOf
、MapOf
、PtrTo
和 SliceOf
。
StructTag
的新方法 Lookup
類似於 Get
,但區分不包含給定金鑰的標記和關聯空字串與給定金鑰的標記。
方法 Method
和 NumMethod
已不再傳回或計算 Type
和 Value
的未匯出方法。
strings
在 Go 的前一個版本中,如果 Reader
的 Read
方法被要求傳回 0 個位元組,不剩任何資料,它會傳回計數值 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.Cmd
的 SysProcAttr
欄位)有新的 Unshareflags
欄位。如果欄位不是零,則由 ForkExec
(用於 exec.Cmd
的 Run
方法)建立的子程序會在執行新程式之前呼叫 unshare(2) 系統呼叫。
unicode
已將整個系統中的 unicode
套件以及關聯的支援從版本 8.0 升級至 Unicode 9.0。