Go 1.8 發行說明

Go 1.8 簡介

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

此版本增加了對 32 位 MIPS 的支援更新了編譯器後端以生成更高效的程式碼,透過消除停止世界的堆疊重新掃描來減少 GC 暫停增加了 HTTP/2 Push 支援增加了 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) 機器,這些機器實現了 MIPS32r1 指令集並帶有 FPU 或核心 FPU 模擬。請注意,許多常見的基於 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 版本。在舊版 OS X 上編譯 Go 或執行二進位制檔案未經測試。

Go 1.8 將是最後一個支援 ARMv5E 和 ARMv6 處理器上 Linux 的版本:Go 1.9 可能需要 ARMv6K(如 Raspberry Pi 1 中所見)或更高版本。要識別 Linux 系統是否為 ARMv6K 或更高版本,請執行 “go tool dist -check-armv6k”(為了方便測試,也可以只將 dist 命令複製到系統而無需安裝完整的 Go 1.8 版本),如果程式以輸出 “ARMv6K supported.” 終止,則系統實現了 ARMv6K 或更高版本。非 Linux ARM 系統上的 Go 已要求 ARMv6K 或更高版本。

zos 現在是 GOOS 的一個已識別值,保留用於 z/OS 作業系統。

已知問題

FreeBSD 和 NetBSD 上存在一些已知但未解決的不穩定性。這些可能在極少數情況下導致程式崩潰。請參閱問題 15658問題 16511。任何解決這些問題的幫助都將不勝感激。

工具

彙編器

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

對於 64 位 PPC 系統,已新增常用向量標量指令:LXSLXSDXLXSILXSIWAXLXSIWZXLXVLXVD2XLXVDSXLXVW4XMFVSRMFVSRDMFVSRWZMTVSRMTVSRDMTVSRWAMTVSRWZSTXSSTXSDXSTXSISTXSIWXSTXVSTXVD2XSTXVW4XXSCVXSCVDPSPXSCVDPSPNXSCVDPSXDSXSCVDPSXWSXSCVDPUXDSXSCVDPUXWSXSCVSPDPXSCVSPDPNXSCVSXDDPXSCVSXDSPXSCVUXDDPXSCVUXDSPXSCVXXSCVXPXVCVXVCVDPSPXVCVDPSXDSXVCVDPSXWSXVCVDPUXDSXVCVDPUXWSXVCVSPDPXVCVSPSXDSXVCVSPSXWSXVCVSPUXDSXVCVSPUXWSXVCVSXDDPXVCVSXDSPXVCVSXWDPXVCVSXWSPXVCVUXDDPXVCVUXDSPXVCVUXWDPXVCVUXWSPXVCVXXVCVXPXXLANDXXLANDCXXLANDQXXLEQVXXLNANDXXLNORXXLORXXLORCXXLORQXXLXORXXMRGXXMRGHWXXMRGLWXXPERMXXPERMDIXXSELXXSIXXSLDWIXXSPLTXXSPLTW

Yacc

yacc 工具(以前透過執行 “go tool yacc” 可用)已移除。從 Go 1.7 開始,Go 編譯器不再使用它。它已移至 “tools” 倉庫,現在可在 golang.org/x/tools/cmd/goyacc 獲得。

修復

fix 工具有一個新的 “context” 修復,用於將匯入從 “golang.org/x/net/context” 更改為 “context”。

Pprof

pprof 工具現在可以使用 “https+insecure” URL 方案來分析 TLS 伺服器並跳過證書驗證。

callgrind 輸出現在具有指令級粒度。

Trace

trace 工具有一個新的 -pprof 標誌,用於從執行跟蹤生成與 pprof 相容的阻塞和延遲配置檔案。

垃圾回收事件現在在執行跟蹤檢視器中顯示得更清晰。垃圾回收活動顯示在其自己的行上,並且 GC 助手 goroutine 被標註了其角色。

Vet

Vet 在某些方面更嚴格,而在以前導致誤報的地方則更寬鬆。

Vet 現在檢查鎖陣列的複製、重複的 JSON 和 XML 結構欄位標籤、非空格分隔的結構標籤、在檢查錯誤之前對 HTTP Response.Body.Close 的延遲呼叫,以及 Printf 中的帶索引引數。它還改進了現有檢查。

編譯器工具鏈

Go 1.7 引入了用於 64 位 x86 系統的新編譯器後端。在 Go 1.8 中,該後端得到了進一步開發,現在用於所有架構。

基於靜態單賦值形式 (SSA) 的新後端生成更緊湊、更高效的程式碼,併為邊界檢查消除等最佳化提供了更好的平臺。新後端使我們的基準程式在 32 位 ARM 系統上所需的 CPU 時間減少了 20-30%。對於在 Go 1.7 中已使用 SSA 後端的 64 位 x86 系統,增益更為適中,為 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 版本包含 Go 1.6.1 版本的 gccgo。我們預計下一個版本 GCC 7 將包含 Go 1.8 版本的 gccgo。

預設 GOPATH

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

Go get

go get” 命令現在始終尊重 HTTP 代理環境變數,無論是否使用 -insecure 標誌。在以前的版本中,-insecure 標誌的副作用是不使用代理。

Go bug

新的 “go bug” 命令在 GitHub 上啟動一個錯誤報告,其中預填充了有關當前系統的資訊。

Go doc

go doc” 命令現在將常量和變數與它們的型別分組,遵循 godoc 的行為。

為了提高 doc 輸出的可讀性,每個一級項的摘要都保證佔用一行。

現在可以請求介面定義中特定方法的文件,例如 “go doc net.Conn.SetDeadline”。

外掛

Go 現在為外掛提供了早期支援,包括用於生成用 Go 編寫的外掛的 “plugin” 構建模式,以及用於在執行時載入此類外掛的新 plugin 包。外掛支援目前僅在 Linux 上可用。請報告任何問題。

執行時

引數活躍性

垃圾回收器不再認為引數在整個函式中都是活躍的。有關更多資訊,以及如何強制變數保持活躍,請參閱 Go 1.7 中新增的 runtime.KeepAlive 函式。

更新: 在分配物件上設定終結器的程式碼可能需要在使用該物件的函式或方法中新增對 runtime.KeepAlive 的呼叫。閱讀 KeepAlive 文件及其示例以獲取更多詳細資訊。

併發對映誤用

在 Go 1.6 中,執行時添加了輕量級、盡力而為的併發誤用對映檢測。此版本改進了該檢測器,支援檢測同時寫入和迭代對映的程式。

一如既往,如果一個 goroutine 正在寫入對映,則沒有其他 goroutine 應該併發地讀取(包括迭代)或寫入對映。如果執行時檢測到此情況,它將列印診斷資訊並使程式崩潰。瞭解此問題的最佳方法是在競態檢測器下執行程式,它將更可靠地識別競態並提供更多詳細資訊。

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 還有更多工作要做。

Defer

延遲函式呼叫的開銷已減少約一半。

Cgo

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

標準庫

示例

許多包的文件中都添加了示例。

排序

sort 包現在包含一個便捷函式 Slice,用於根據 less 函式對切片進行排序。在許多情況下,這意味著不再需要編寫新的排序器型別。

同時新增了 SliceStableSliceIsSorted

HTTP/2 Push

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。現在,除非存在 AES-GCM 的硬體支援,否則 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 方法可確保在請求完成時關閉連線並將其返回到連線池;如果驅動程式支援,則啟用取消正在進行的查詢;並允許資料庫池取消等待下一個可用連線。

事務開始時可以透過設定 TxOptions.Isolation 上的隔離級別並將其傳遞給 DB.BeginTx 來設定 IsolationLevel。如果選擇的隔離級別驅動程式不支援,則會返回錯誤。還可以透過將 TxOptions.ReadOnly 設定為 true 來設定事務的只讀屬性。

現在,查詢會為支援它的驅動程式公開 SQL 列型別資訊。行可以返回 ColumnTypes,其中可以包含 SQL 型別資訊、列型別長度和 Go 型別。

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

NamedArg 可用作查詢引數。新函式 Named 有助於更簡潔地建立 NamedArg

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

新的 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 返回包的 HTTP 處理程式,以便將其安裝到非標準位置。

fmt

ScanfFscanfSscanf 現在與以前的版本相比,對空格的處理方式不同且更一致。有關詳細資訊,請參閱掃描文件

go/doc

新的 IsPredeclared 函式報告字串是否為預宣告識別符號。

go/types

新函式 Default 返回“無型別”型別的預設“有型別”型別。

complex64 的對齊現在與 Go 編譯器匹配。

html/template

該包現在驗證 <script> 標籤上的 "type" 屬性。

image/png

Decode(和 DecodeConfig)現在支援真彩色和灰度透明度。

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 設定當監聽器關閉時,底層套接字檔案是否應從檔案系統中移除。

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

新的 Resolver 查詢名稱和數字並支援 context.ContextDialer 現在有一個可選的 Resolver 欄位

Interfaces 現在在 Solaris 上受支援。

Go DNS 解析器現在支援 resolv.conf 的 “rotate” 和 “option ndots:0” 選項。“ndots” 選項現在以與 libresolve 相同的方式受到尊重。

net/http

伺服器更改

  • 伺服器現在支援優雅關閉,如上文所述
  • Server 增加了配置選項 ReadHeaderTimeoutIdleTimeout,並記錄了 WriteTimeout
  • FileServerServeContent 現在支援 HTTP If-Match 條件請求,除了以前對根據 RFC 7232 第 2.3 節正確格式化的 ETag 的 If-None-Match 支援。

伺服器的 Handler 可以執行的功能有幾項新增:

  • 如果底層 net.Conn 關閉,則 Request.Context 返回的 Context 將被取消。例如,如果使用者在慢速請求中關閉瀏覽器,Handler 現在可以檢測到使用者已離開。這補充了現有的 CloseNotifier 支援。此功能要求底層 net.Conn 實現最近澄清的介面文件
  • 要在標頭已寫入後提供預告片,請參閱新的 TrailerPrefix 機制。
  • Handler 現在可以透過使用錯誤 ErrAbortHandler 觸發 panic 來中止響應。
  • 現在,向 ResponseWriter 寫入零位元組被定義為一種測試 ResponseWriter 是否被劫持的方法:如果是,則 Write 返回 ErrHijacked,而不會向伺服器的錯誤日誌列印錯誤。

客戶端和傳輸更改

  • Client 現在會在重定向時複製大多數請求頭。有關詳細資訊,請參閱 Client 型別文件
  • Transport 現在支援國際域名。因此,Get 和其他輔助函式也支援。
  • 客戶端現在支援 301、307 和 308 重定向。例如,Client.Post 現在遵循 301 重定向,將其轉換為不帶主體的 GET 請求,就像以前處理 302 和 303 重定向響應一樣。客戶端現在還遵循 307 和 308 重定向,保留原始請求方法和主體(如果有)。如果重定向需要重新發送請求主體,則請求必須定義新的 Request.GetBody 欄位。NewRequest 會自動為常見主體型別設定 Request.GetBody
  • Transport 現在拒絕埠中包含非數字字元的 URL 請求。
  • 如果網路故障發生前未寫入任何位元組且請求沒有主體,則 Transport 現在將重試非冪等請求。
  • 新的 Transport.ProxyConnectHeader 允許配置在 CONNECT 請求期間傳送給代理的頭值。
  • DefaultTransport.Dialer 現在啟用 DualStack(“Happy Eyeballs”)支援,允許在 IPv6 可能失敗時使用 IPv4 作為備用。
  • Request.ContentLength 為零時,Transport 不再讀取非 nil Request.Body 的一個位元組,以確定 ContentLength 實際上是零還是未定義。要顯式表示主體長度為零,請將其設定為 nil,或將其設定為新值 NoBody。新的 NoBody 值旨在用於 Request 建構函式;它由 NewRequest 使用。

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 用於將目錄重新命名為現有空目錄時,現在會返回錯誤。以前,當重新命名為非空目錄時會失敗,但當重新命名為目錄時會成功。這使得 Unix 上的行為與其他系統一致。

在 Windows 上,長絕對路徑現在會自動轉換為擴充套件長度路徑(以 “\\?\” 開頭的路徑)。這使得該包能夠處理路徑名超過 260 個字元的檔案。

在 Windows 上,os.IsExist 現在將對系統錯誤 ERROR_DIR_NOT_EMPTY 返回 true。這大致對應於對 Unix 錯誤 ENOTEMPTY 的現有處理。

在 Plan 9 上,未由 #M 服務的檔案現在將在 FileInfo.Mode 返回的值中設定 ModeDevice

path/filepath

修復了 Windows 上的一些 bug 和邊緣情況:Abs 現在按文件呼叫 CleanGlob 現在匹配 “\\?\c:\*”,EvalSymlinks 現在正確處理 “C:.”,Clean 現在正確處理路徑中的前導 “..”。

reflect

添加了新函式 Swapper 以支援 sort.Slice

strconv

Unquote 函式現在會剝離反引號原始字串中的回車符(\r),遵循 Go 語言語義

syscall

Getpagesize 現在返回系統的大小,而不是一個常量值。以前它總是返回 4KB。

Solaris 上的 Utimes 簽名已更改,以匹配所有其他 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。

testing

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

新函式 CoverMode 報告測試覆蓋模式。

如果啟用了競態檢測器並且在執行期間發生資料競態,則測試和基準測試現在被標記為失敗。以前,單個測試用例似乎會透過,而只有測試二進位制檔案的整體執行會失敗。

MainStart 函式的簽名已更改,如文件所允許。它是一個內部細節,不屬於 Go 1 相容性承諾的一部分。如果您沒有直接呼叫 MainStart 但看到錯誤,那很可能意味著您設定了通常為空的 GOROOT 環境變數,並且它與您的 go 命令二進位制檔案的版本不匹配。

unicode

如果提供的輸入是無效的 rune,SimpleFold 現在返回其引數不變。以前,該實現會因索引越界檢查 panic 而失敗。