Go 1.8 發行說明

Go 1.8 簡介

最新版 Go 1.8 在 Go 1.7 發行六個月後問世。其變更大部分在於工具鏈、執行時期和函式庫的實作。在語言規格中則有 兩項次要變更。一如既往,這個版本維持 Go 1 相容性承諾。我們預期幾乎所有 Go 程式都會繼續像以往一樣編譯和執行。

此版本 新增對 32 位元 MIPS 的支援更新編譯器後端 以產生更有效率的程式碼、減少 GC 暫停 時間,方法是取消暫停執行緒的堆疊重新掃描、新增 HTTP/2 推播支援新增 HTTP 優雅關閉功能新增更多背景支援啟用鎖檔分析,以及 簡化切片的排序

語言的變更

從 Go 1.8 起,當明確地將某個結構類型中的值轉換為另一個類型時,標籤將被忽略。因此,兩個僅在標籤上不同的結構可以互相轉換

func example() {
    type T1 struct {
        X int `json:"foo"`
    }
    type T2 struct {
        X int `json:"bar"`
    }
    var v1 T1
    var v2 T2
    v1 = T1(v2) // now legal
}

語言規範現在只要求實作支援浮點數常數中的 16 位元指數。這不會影響「gc」或 gccgo 編譯器,兩者仍支援 32 位元指數。

傳輸埠

Go 現在支援 Linux 上的 32 位元 MIPS,支援大端序 (linux/mips) 和小端序機器 (linux/mipsle),其實作帶有 FPU 或核心 FPU 模擬的 MIPS32r1 指令集。請注意,許多常見的 MIPS 基礎路由器缺少 FPU,且其韌體未啟用核心 FPU 模擬;Go 無法在這些機器上執行。

在 DragonFly BSD 上,Go 現在需要使用 DragonFly 4.4.4 或更新版本。

在 OpenBSD 上,Go 現在需要使用 OpenBSD 5.9 或更新版本。

現在,Plan 9 傳輸埠的網路支援功能變得更完整,且與 Unix 和 Windows 在最後期限和取消方面相符的行為。針對 Plan 9 核心需求,請參閱 Plan 9 Wiki 頁面

Go 1.8 現在只支援 OS X 10.8 或更新版本。這很可能是最後一個支援 10.8 的 Go 版本。編譯 Go 或在較舊的 OS X 版本上執行二進位檔並未經過測試。

Go 1.8 將會是最後一個支援 ARMv5E 和 ARMv6 處理器的 Linux 版本:Go 1.9 可能需要 ARMv6K (例如 Raspberry Pi 1 中的 ARMv6K) 或更新版本。若要識別 Linux 系統是否為 ARMv6K 或更新版本,請執行「go tool dist -check-armv6k」(若要協助測試,也可將 dist 指令複製到系統中,而無需安裝完整版本的 Go 1.8),且若此程式以輸出「ARMv6K 支援」來終止,則系統實作 ARMv6K 或更新版本。非 Linux ARM 系統上的 Go 已需要 ARMv6K 或更新版本。

zos 現在是 GOOS 的公認值,專供 z/OS 作業系統使用。

已知問題

FreeBSD 和 NetBSD 上有一些不穩定性,但尚未了解問題出在哪裡。這些問題偶爾會導致程式崩潰。請參考 第 15658 個問題第 16511 個問題。若能找出解決這些問題的方法將會是一大幫助。

工具

組譯器

針對 64 位元 x86 系統,已新增下列指令:VBROADCASTSDBROADCASTSSMOVDDUPMOVSHDUPMOVSLDUPVMOVDDUPVMOVSHDUPVMOVSLDUP

對於 64 位元 PPC 系統,已新增下列常見向量純量指令:LXSLXSDXLXSILXSIWAXLXSIWZXLXVLXVD2XLXVDSXLXVW4XMFVSRMFVSRDMFVSRWZMTVSRMTVSRDMTVSRWAMTVSRWZSTXSSTXSDXSTXSISTXSIWXSTXVSTXVD2XSTXVW4XXSCVXSCVDPSPXSCVDPSPNXSCVDPSXDSXSCVDPSXWSXSCVDPUXDSXSCVDPUXWSXSCVSPDPXSCVSPDPNXSCVSXDDPXSCVSXDSPXSCVUXDDPXSCVUXDSPXSCVXXSCVXPXVCVXVCVDPSPXVCVDPSXDSXVCVDPSXWSXVCVDPUXDSXVCVDPUXWSXVCVSPDPXVCVSPSXDSXVCVSPSXWSXVCVSPUXDSXVCVSPUXWSXVCVSXDDPXVCVSXDSPXVCVSXWDPXVCVSXWSPXVCVUXDDPXVCVUXDSPXVCVUXWDPXVCVUXWSPXVCVXXVCVXPXXLANDXXLANDCXXLANDQXXLEQVXXLNANDXXLNORXXLORXXLORCXXLORQXXLXORXXMRGXXMRGHWXXMRGLWXXPERMXXPERMDIXXSELXXSIXXSLDWIXXSPLT,以及 XXSPLTW

Yacc

yacc 工具(先前可透過執行「go tool yacc」來取得)已移除。在 Go 1.7 起,它已不再由 Go 編譯器所使用。它已移至「tools」存放庫,您現在可透過 golang.org/x/tools/cmd/goyacc 來取得。

Fix

fix 工具新增一個「context」修正,用來將「golang.org/x/net/context」中的匯入項目變更為「context」。

Pprof

pprof 工具現在可以設定檔 TLS 伺服器,並透過使用「https+insecure」URL 策略來略過憑證驗證。

Callgrind 輸出的指令級別粒度現在較為精細。

Trace

trace 工具新增 -pprof 旗標,可從執行追蹤建立與 pprof 相容的封鎖和延遲設定檔。

垃圾回收事件現在在執行追蹤檢視器中以更清楚的方式顯示。垃圾回收活動會顯示在它自己的列中,且 GC 協助常式會附註上它們的角色。

Vet

Vet 在某些方面更嚴格,但在先前導致誤判的方面則較寬鬆。

Vet 現在會檢查是否複製了一個鎖定陣列、重複的 JSON 和 XML 結構欄位標籤、非空白分隔的結構標籤、在檢查錯誤之前暫緩呼叫 HTTP Response.Body.Close,以及 Printf 中的索引參數。它也會改善現有的檢查。

編譯器工具鏈

Go 1.7 為 64 位元 x86 系統引進一個新的編譯器後端。在 Go 1.8 中,該後端已進一步開發,並已用於所有架構。

此個新作後端,以 靜態單一賦值 (SSA) 為基礎,產生更精簡、更高效的程式碼,並提供一個更佳的平台進行最佳化,如邊界檢查消除。此新作後端減少我們的基準程式的 CPU 時間 20-30%,在 32 位元 ARM 系統上。對於 64 位元 x86 系統,已在 Go 1.7 中使用 SSA 後端,其增益更為保守,只有 0-10%。其他架構可能同樣會看到更接近 32 位元 ARM 數字的改良。

Go 1.7 中引進的暫時 -ssa=0 編譯器旗標用於停用此新作後端,已於 Go 1.8 中移除。

除了為所有系統啟用此新作編譯器後端,Go 1.8 也引進一個新的編譯器前端。新的編譯器前端,對使用者來說應無明顯感知,但為後續效能工作奠定基礎。

編譯器和連結器已在本次版本最佳化並執行得比 Go 1.7 更快,儘管仍然比我們預期的慢,也將持續在未來的版本中進行最佳化。與先前的版本相比,Go 1.8 快約 15%

Cgo

現在,Go 工具會記住 make.bash 期間設定的 CGO_ENABLED 環境變數值,並將其套用到所有後續編譯,以修正問題 #12808。在執行原生編譯時,很少需要明顯設定 CGO_ENABLED 環境變數,因為 make.bash 會自動偵測正確的設定。明確設定 CGO_ENABLED 環境變數的主要原因在於,當你的環境支援 cgo,但你明確不需要 cgo 的支援時,此時需在 make.bashall.bash 設定 CGO_ENABLED=0

環境變數 PKG_CONFIG 現在可設定用於處理 #cgo pkg-config 指令的執行程式。預設值為 pkg-config,與早先版本始終使用的程式相同。其用意在於簡化 cgo 程式碼的交叉編譯。

現在,cgo 工具支援 -srcdir 選項,go 指令會使用此選項。

如果 cgo 程式碼呼叫 C.malloc,且 malloc 傳回 NULL,則此程式現在會因記憶體不足的錯誤而中斷。C.malloc 永遠不會傳回 nil。與大多數 C 函式不同,C.malloc 不能以回傳一 errno 值的雙重結果形式使用。

如果 cgo 用來呼叫 C 函數,傳遞指標給 C 聯集,而 C 聯集可以包含任何指標值,而且 cgo 指標檢查 已啟用(預設是啟用的),現在會針對聯集值檢查 Go 指標。

Gccgo

因為 Go 的半年制發布時程與 GCC 的一年制發布時程調整,GCC 發布 6 會包含 gccgo 的 Go 1.6.1 版本。我們預計下一次發布,GCC 7,會包含 gccgo 的 Go 1.8 版本。

預設 GOPATH

如果 GOPATH 環境變數 未設定,現在會有一個預設值。在 Unix 上預設值是 $HOME/go,在 Windows 上預設值是 %USERPROFILE%/go

Go 取得

無論是否使用 -insecure 標記,「go get」指令現在總是會遵循 HTTP 代理環境變數。在之前的版本中,-insecure 標記有副作用,不會使用代理伺服器。

Go 錯誤

新的「go bug」指令會在 GitHub 上開始錯誤報告,報告會預先填入有關目前系統的資訊。

Go 說明

go doc」指令現在會將常數和變數依其類型分組,並遵循 godoc 的行為。

為了提高 doc 的輸出可讀性,保證每一則首要項目的摘要會佔據單一列。

現在可以要求某個介面定義中特定方法的說明,例如「go doc net.Conn.SetDeadline」。

外掛程式

現在 Go 提供外掛程式的早期支援,支援「plugin」建置模式用來產生以 Go 編寫的外掛程式,以及一個新的 plugin 套件,用來在執行時間載入這些外掛程式。外掛程式支援目前僅在 Linux 上提供。請回報任何問題。

執行時間

引數實際存在狀態

垃圾收集器不再在整個函數中將引數視為實際存在。若要取得更多資訊,以及如何強制變數保持實際存在的資訊,請參閱 Go 1.7 中新增的 runtime.KeepAlive 函數。

更新:針對分配物件設定終結器的程式碼可能需要在使用該物件的函數或方法中加入對 runtime.KeepAlive 的呼叫。請詳閱 KeepAlive 說明文件 及其範例以取得更多詳細資訊。

並發地圖誤用

在 Go 1.6 中,時程(runtime)加入輕量級、盡力而為地偵測 map 的同時錯誤使用。此版本改良偵測器,可支援偵測同時寫入並迭代 map 的程式。

一如往常,如果一個 goroutine 正寫入 map,則不應有任何其他 goroutine 同時讀取(包含迭代)或寫入 map。如果時程偵測到此狀況,會打印診斷並終止程式。找出問題的最佳方式是在 競爭偵測器下執行程式,競爭偵測器可以更可靠地識別競爭並提供更多詳細資訊。

MemStats 文件

runtime.MemStats 類型已被更詳細地文件化。

效能

一如以往,變動非常普遍且多樣,難以提出效能的精確說明。由於垃圾收集器的加速和標準程式庫的最佳化,多數程式應可執行得快一點。

已最佳化下列套件中的實作:bytescrypto/aescrypto/ciphercrypto/ellipticcrypto/sha256crypto/sha512encoding/asn1encoding/csvencoding/hexencoding/jsonhash/crc32image/colorimage/drawmathmath/bigreflectregexpruntimestrconvstringssyscalltext/templateunicode/utf8

垃圾收集器

垃圾收集暫停時間應明顯比 Go 1.7 短很多,通常在 100 微秒以下,而且常常低到僅 10 微秒。詳情請參閱 關於消除停止世界的堆疊重新掃描的文件。Go 1.9 仍有許多工作要做。

延後

延後函數呼叫 的開銷已減少約一半。

Cgo

從 Go 呼叫 C 的開銷已減少約一半。

標準函式庫

範例

已在多個套件的文件中加入範例。

排序

sort 套件現在包含方便的函數 Slice,可以在給定較小函數的情況下對切片進行排序。這樣在許多情況下就不需要撰寫新的排序類型。

還有兩個新函數:SliceStableSliceIsSorted

HTTP/2 推送

現在,net/http 套件包含一種機制,可從 Handler 傳送 HTTP/2 伺服器推播。 類似現有的 FlusherHijacker 介面,HTTP/2 ResponseWriter 現在實作新的 Pusher 介面。

HTTP 伺服器正常關閉

HTTP 伺服器現在支援使用新的 Server.Shutdown 方法進行正常關閉,並使用新的 Server.Close 方法進行突然關閉。

更多內容支援

在既有套件中持續 採用 Go 1.7 當中的 context.Context, Go 1.8 在現有套件中加入更多內容支援

互斥鎖競爭分析

執行時期和工具現在支援分析有競爭互斥鎖。

大部分的使用者都會想要在「go test」中使用新的 -mutexprofile 標幟,然後在結果檔案上使用 pprof

此外,也可以透過新的 MutexProfileSetMutexProfileFraction 取得較低層級的支援。

Go 1.8 已知限制為分析僅會報告 sync.Mutex 的競爭,不包括 sync.RWMutex

程式庫的小幅變更

和之前一樣,程式庫中有各種小幅變更,並在考慮到 Go 1 相容性承諾 的情況下進行更新。下列各節會列出使用者可見的變更和新增內容。 對於最佳化和次要的錯誤修正將不會在此列出。

archive/tar

tar 實作已修正檔案格式中許多角落案例的錯誤。 Reader 現在能處理 PAX 格式的 tar 檔案,且每個項目的容量超過 8GB。 Writer 在涉及長路徑時不會再產生無效的 tar 檔案。

compress/flate

已對編碼器進行一些小幅變更,以改善特定情況下的壓縮比。編碼的 DEFLATE 確切輸出結果可能與 Go 1.7 不同。由於 DEFLATE 是 gzip、png、zlib 和 zip 等格式的基礎壓縮方式,這些格式的輸出結果可能會有所變更。

編碼器以 NoCompression 模式運作時,會產生一致的輸出結果,此輸出結果不受傳遞給 Write 方法的區塊大小影響。

解碼器在遇到錯誤時,會傳回已解壓縮的任何緩衝資料,以及錯誤。

compress/gzip

如果 Header.ModTime 欄位為零值,Writer 會針對零 MTIME 欄位進行編碼。在之前發布的 Go 版本中,Writer 會編碼無理數值。類似地,Reader 現在會將編碼成零的 MTIME 欄位傳回為零的 Header.ModTime

context

DeadlineExceeded 錯誤現在已經導入 net.Error,並會針對 TimeoutTemporary 方法傳回 true。

crypto/tls

新的方法 Conn.CloseWrite 允許 TLS 連線進行一半的關閉。

新的方法 Config.Clone 會複製一個 TLS 組態。

新的 Config.GetConfigForClient 回呼允許根據用戶端的 ClientHelloInfo 動態地選擇用戶端的組態。ClientHelloInfo 結構現在擁有新的欄位 ConnSignatureSchemes(使用 SignatureScheme 新的型別)、SupportedProtosSupportedVersions

新的 Config.GetClientCertificate 回呼允許選擇用戶端憑證,這個憑證是根據伺服器的 TLS CertificateRequest 訊息,由新的 CertificateRequestInfo 表示。

新的 Config.KeyLogWriter 允許使用 WireShark 等工具來對 TLS 連線進行偵錯。

新的 Config.VerifyPeerCertificate 回呼允許對同儕提供的憑證執行其他驗證。

crypto/tls 套件現針對 CBC 填充預言實作基本的對策措施。不應有明確依賴機密的時機,但不會嘗試標準化記憶體存取以防止快取時機外洩。

crypto/tls 套件現支援 X25519 與ChaCha20-Poly1305。現優先使用 ChaCha20-Poly1305,除非存在 AES-GCM 的硬體支援。

搭配 SHA-256 的 AES-128-CBC 加密組也已受支援,但預設為停用狀態。

crypto/x509

現支援 PSS 簽章。

UnknownAuthorityError 現具有 Cert 欄位,會回報不受信任的憑證。

憑證驗證在某些情況下變得更加許可,而在其他情況則變得更加嚴格。

根憑證現在也會在 Linux 上的 /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem 被搜尋,以支援 RHEL 和 CentOS。

database/sql

此套件現支援 context.Context。有新的方法以 Context 結尾,例如 DB.QueryContextDB.PrepareContext,它們會採用 context 引數。使用新的 Context 方法可以確保在請求完成時連線會關閉並傳回連線池;能夠取消進行中的查詢(前提是驅動程式支援);而且允許資料庫池取消等待下一個可用連線。

在開始交易時,現在可以使用 IsolationLevel 透過在 TxOptions.Isolation 上設定隔離層級,並傳遞給 DB.BeginTx 來設定隔離層級。如果選取驅動程式不支援的隔離層級,就會傳回錯誤。也可以透過將 TxOptions.ReadOnly 設定為 true,在交易中設定唯讀屬性。

現在,查詢會揭露支援的驅動程式的 SQL 資料行類型資訊。資料列可以傳回 ColumnTypes,其中可能包含 SQL 型別資訊、資料行型別長度,以及 Go 型別。

Rows 現在可以代表多個結果集。在 Rows.Next 傳回 false 之後,可以呼叫 Rows.NextResultSet 以進展到下一個結果集。現有的 Rows 應持續在進展到下一個結果集之後使用。

NamedArg 可能用作查詢引數。新函式 Named 協助更簡要地建立 NamedArg

如果驅動程式支援新的 Pinger 介面,DB.PingDB.PingContext 方法將使用該介面檢查資料庫連接是否有效。

新的 Context 查詢方法適用於所有驅動程式,但除非驅動程式已更新為使用 Context,否則 Context 取消無回應。其他功能需要 database/sql/driver 中的驅動程式支援。驅動程式作者應檢閱新介面。現有驅動程式的使用者應檢閱驅動程式文件,查看其支援的內容和每個功能的任何特定於系統的文件。

debug/pe

已擴充套件套件,目前由 Go 鏈結器 用於讀取 gcc 生成的物件檔。新的 File.StringTableSection.Relocs 欄位提供對 COFF 字串表和 COFF 移位的存取。新的 File.COFFSymbols 允許低層存取 COFF 符號表。

encoding/base64

新的 Encoding.Strict 方法傳回一個 Encoding,當尾隨的填充位非零時,導致解碼器傳回錯誤。

encoding/binary

ReadWrite 現在支援布林值。

encoding/json

UnmarshalTypeError 現在包含結構和欄位名稱。

現在,一個 nil 的 Marshaler 會將其編組為 JSON null 值。

一個 RawMessage 值現在依其指標類型編組。

Marshal 使用與 ES6 中相同的格式對浮點數進行編碼,針對更廣泛的值範圍優先使用小數(非指數)表記法。特別是,所有浮點數整數最多為 264,其格式與等效的 int64 呈現方式相同。

在以前版本的 Go 中,將 JSON null 解組成 Unmarshaler 被視為無作用;現在,UnmarshalerUnmarshalJSON 方法會與 JSON 字面值 null 一起呼叫,並可定義該案例的語意。

encoding/pem

Decode 現在嚴格限制結尾的格式。

encoding/xml

Unmarshal 現在有萬用字元支援,可使用新的 ",any,attr" 結構標籤收集所有屬性。

expvar

新的方法 Int.ValueString.ValueFloat.ValueFunc.Value 報告已匯出的變數的目前值。

新函式 Handler 傳回 package 的 HTTP 處理函式,以利於非標準位置的安裝。

fmt

ScanfFscanfSscanf 現在處理空白的方式不同於先前的版本,且更一致。請參閱 掃描文件記錄,以取得詳細資料。

go/doc

新的 IsPredeclared 函式會回報字串是否是預先宣告的識別碼。

go/types

新的函式 Default 傳回「非型態」型態的預設「型態化」型態。

complex64 的比對方式現在和 Go 編譯器 一致。

html/template

此套件現在在 <script> 標籤上認證 "type" 屬性。

image/png

Decode(和 DecodeConfig)現在支援 True Color 和灰階透明度。

Encoder 現在編碼類色盤影像時更快速且產生的輸出較小。

math/big

新的函式 Int.Sqrt 會計算 ⌊√x⌋。

新的函式 Float.Scanfmt.Scanner 的支援常式。

Int.ModInverse 現在支援負數。

math/rand

新的 Rand.Uint64 函式會傳回 uint64 值。新的 Source64 介面描述能夠直接產生此類值的來源;否則 Rand.Uint64 函式會從 SourceInt63 函式呼叫兩次來建構 uint64

mime

ParseMediaType 現在會保留不必要的反斜線跳脫作為字面值,以支援 MSIE。當 MSIE 傳送完整檔案路徑(在「網際網路模式」中),不會跳脫反斜線:「C:\dev\go\foo.txt」,而非「C:\\dev\\go\\foo.txt」。如果看到不必要的反斜線跳脫字元,現在會預設是來自 MSIE 且用來當成字面值的反斜線。目前沒有已知的 MIME 產生器會針對數字和字母等簡單記號字元發出不必要的反斜線跳脫。

mime/quotedprintable

Reader 的解譯已以兩種方式放寬,可接受在野外看到的更多輸入。首先,它接受後面沒有兩個十六進制數字的等號 (=) 作為字面值等號。其次,它會在編碼輸入的結尾忽略多餘的等號。

net

Conn 文件已更新以釐清介面實作的預期。net/http 套件中的更新會根據遵守文件所要求內容的實作。

正在更新:Conn 介面的實作應該驗證他們是否實作已記載的語意。golang.org/x/net/nettest 套件會使用一個 Conn 並驗證其是否適當地執行。

新的方法 UnixListener.SetUnlinkOnClose 設定當偵聽程式關閉時,是否應自檔案系統移除基礎的 socket 檔案。

新的 Buffers 類型准許從記憶體中的多個非連續區塊緩衝區更有效率地寫入網路。在某些機器中,對於某些類型的連線,這會最佳化至作業系統特定的批次寫入作業(例如 writev)。

新的 Resolver 查詢名稱和數字,並支援 context.ContextDialer 現在具有選擇性的 Resolver 欄位

Interfaces 現在在 Solaris 中受到支援。

Go DNS 解析器現在支援 resolv.conf 的「rotate」和「option ndots:0」選項。現在以與 libresolve 相同的方式遵循「ndots」選項。

net/http

伺服器變更

伺服器的 Handler 可以做的事情新增了數個項目

CLIENT 與 TRANSPORT 的變更

net/http/httptrace

現在可以使用新的 ClientTrace.TLSHandshakeStartClientTrace.TLSHandshakeDone 來追蹤客戶端要求的 TLS 握手。

net/http/httputil

ReverseProxy 有個新的選項掛鉤 ModifyResponse,用於在傳遞到客戶端之前修改後端傳來的回應。

net/mail

在地址的名稱部分中,現在再次允許使用空的引號字串。亦即,Go 1.4 及更早版本會接受 "" <gopher@example.com>,但 Go 1.5 引進了一個錯誤,會拒絕這個地址。此地址現在再次被辨識。

Header.Date 方法一直提供解析 Date: 標頭的方法。新的函數 ParseDate 允許解析在其他標頭列中找到的日期,例如 Resent-Date: 標頭。

net/smtp

如果 Auth.Start 方法的實作傳回空的 toServer 值,此套件不再會在 SMTP AUTH 指令中傳送尾隨空白,有些伺服器會拒絕這樣的指令。

net/url

新的函數 PathEscapePathUnescape 類似於查詢轉換和換回函數,不過是用於路徑元素。

新的方法 URL.HostnameURL.Port 會傳回 URL 的主機名稱和埠段,且如果埠段不存在也會正確處理。

現有的方法 URL.ResolveReference 現在可以正確處理含有轉譯位元組的路徑,而不會遺失這些轉譯。

URL 類型現在實作 encoding.BinaryMarshalerencoding.BinaryUnmarshaler,讓處理 gob 資料 中的 URL 變得可能。

根據 RFC 3986,Parse 現在會拒絕像 this_that:other/thing 這樣的 URL,而不是將它們詮釋為相對路徑(this_that 不是有效的配置)。若要強制做為相對路徑詮釋,這些 URL 應該加上前置字元 “./”。URL.String 方法現在會根據需要插入此前置字元。

os

新的函數 Executable 回傳執行中可執行檔的路徑名稱。

現在,嘗試呼叫已關閉的 os.File 上的方法,會回傳新的錯誤值 os.ErrClosed。先前的版本會回傳特定於系統的錯誤訊息,例如 syscall.EBADF

在 Unix 系統,os.Rename 現在會回傳錯誤,原因是 used 用於將目錄重新命名為現有的空目錄。先前會在重新命名為非空目錄時失敗,但在重新命名為空目錄時會成功。這使得 Unix 上的行為與其他系統相符。

在 Windows,長絕對路徑現在會透明地轉換為延伸長度路徑(從「\\?\」開頭的路徑)。這允許套件處理路徑名稱長度超過 260 個字元的檔案。

在 Windows,os.IsExist 現在會針對系統錯誤 ERROR_DIR_NOT_EMPTY 回傳 true。這大致對應於現有處理 Unix 錯誤 ENOTEMPTY 的方式。

在 Plan 9,未由 #M 提供服務的檔案,其 FileInfo.Mode 回傳值中現在會設定 ModeDevice

path/filepath

已修正 Windows 上的許多錯誤和邊緣狀況: Abs 現在會呼叫 Clean(如文件說明),Glob 現在會比對「\\?\c:\*」,EvalSymlinks 現在會正確處理「C:.」,而 Clean 現在會正確處理路徑中的開頭「..

reflect

已加入新的函數 Swapper 來支援 sort.Slice

strconv

Unquote 函數現在會清除反引號原始字串中的換行符號 (\r),遵循 Go 語言語意

syscall

Getpagesize 現在會回傳系統大小,而非固定值。先前會永遠回傳 4KB。

Utimes 的簽章已在 Solaris 上變更,以符合所有其他 Unix 系統的簽章。可攜式程式碼應繼續使用 os.Chtimes 來取代。

X__cmsg_data 欄位已從 Cmsghdr 中移除。

text/template

Template.Execute 現在可將 reflect.Value 視為其資料引數,而 FuncMap 函數也可接受並回傳 reflect.Value

time

新的函數 Until 是類比函數 Since 的補述。

ParseDuration 現在接受長的小數。

Parse 現在會拒絕早於月開始的日期,例如 6 月 0 日;它已經會拒絕超出月結束的日期,例如 6 月 31 日和 7 月 32 日。

tzdata 資料庫已更新成版本 2016j,適用於尚未有本地時區資料庫的系統。

測試

新的方法 T.Name(和 B.Name)回傳目前測試或基準的的名稱。

新的函數 CoverMode 回報測試涵蓋率模式。

如果啟用競爭偵測,並且執行期間發生資料競爭,測試和基準現在會標示為失敗。以前,個別測試案例會顯示通過,而只有測試二進檔的整體執行才會失敗。

如文件所允許,MainStart 函數的簽章已變更。這是一個內部細節,不屬於 Go 1 相容性承諾的一部分。如果您沒有直接呼叫 MainStart 但看到錯誤,這可能表示您設定了通常為空的 GOROOT 環境變數,而且與您的 go 指令的二進檔版本不符。

unicode

如果提供的輸入為無效的符文,現在SimpleFold 會退回其未變更的參數。以前,實作會失敗,並產生索引界限檢查錯誤。