Go 1.5 發行說明

Go 1.5 簡介

最新的 Go 版本 1.5 是一個重要的版本,包含了對實現進行的主要架構更改。儘管如此,我們預計幾乎所有 Go 程式都能像以前一樣繼續編譯和執行,因為該版本仍然遵守 Go 1 的相容性承諾

實現方面最大的發展是:

  • 編譯器和執行時現在完全用 Go 編寫(只有少量彙編)。C 不再參與實現,因此曾經用於構建分發包的 C 編譯器也已移除。
  • 垃圾收集器現在是併發的,並且透過儘可能與其他 goroutine 並行執行,顯著降低了暫停時間。
  • 預設情況下,Go 程式執行時的 GOMAXPROCS 設定為可用核心數;在之前的版本中,它預設為 1。
  • 現在所有倉庫都支援內部包,而不僅僅是 Go 核心。
  • go 命令現在提供對外部依賴項“vendoring”(版本管理)的實驗性支援
  • 新的 go tool trace 命令支援程式執行的細粒度跟蹤。
  • 一個新的 go doc 命令(與 godoc 不同)專為命令列使用而定製。

這些以及對實現和工具的其他一些更改將在下面討論。

該版本還包含一個關於 map 字面量的小語言更改。

最後,釋出時間偏離了通常的六個月間隔,這既是為了為這個主要版本提供更多的準備時間,也是為了之後調整發布時間表,使釋出日期更方便。

語言變化

Map 字面量

由於疏忽,允許從切片字面量中省略元素型別的規則未應用於 map 鍵。這已在 Go 1.5 中得到糾正。一個例子可以說明這一點。從 Go 1.5 開始,這個 map 字面量,

m := map[Point]string{
    Point{29.935523, 52.891566}:   "Persepolis",
    Point{-25.352594, 131.034361}: "Uluru",
    Point{37.422455, -122.084306}: "Googleplex",
}

可以寫成如下形式,無需顯式列出 Point 型別

m := map[Point]string{
    {29.935523, 52.891566}:   "Persepolis",
    {-25.352594, 131.034361}: "Uluru",
    {37.422455, -122.084306}: "Googleplex",
}

實現

不再有 C

編譯器和執行時現在用 Go 和組合語言實現,沒有 C。樹中僅剩的 C 原始碼與測試或 cgo 相關。在 1.4 及更早版本中,樹中有一個 C 編譯器。它用於構建執行時;部分原因需要一個自定義編譯器來確保 C 程式碼與 goroutine 的堆疊管理一起工作。由於執行時現在在 Go 中,因此不再需要此 C 編譯器,並且它已被移除。消除 C 的過程細節在其他地方討論。

從 C 語言的轉換是在為這項工作建立的自定義工具的幫助下完成的。最重要的是,編譯器實際上是透過將 C 程式碼自動翻譯成 Go 來移動的。它實際上是相同程式的另一種語言版本。它不是編譯器的新實現,因此我們預計此過程不會引入新的編譯器錯誤。此過程的概述可在此簡報的幻燈片中找到。

編譯器和工具

獨立於 Go 語言的遷移,但受其鼓勵,工具的名稱已更改。舊名稱 6g8g 等已移除;現在只有一個二進位制檔案,可作為 go tool compile 訪問,它將 Go 原始碼編譯成適合由 $GOARCH$GOOS 指定的架構和作業系統的二進位制檔案。類似地,現在有一個連結器(go tool link)和一個彙編器(go tool asm)。連結器是從舊的 C 實現自動翻譯的,但彙編器是下面將更詳細討論的新原生 Go 實現。

類似於放棄了 6g8g 等名稱,編譯器和彙編器的輸出現在給定一個普通的 .o 字尾,而不是 .8.6 等。

垃圾收集器

垃圾收集器已在 1.5 中重新設計,作為設計文件中概述的開發的一部分。透過高階演算法、更好的收集器排程以及更多並行收集使用者程式,預期的延遲比以前版本的收集器低得多。收集器的“停止世界”階段幾乎總是低於 10 毫秒,通常遠低於此。

對於受益於低延遲的系統,例如對使用者響應的網站,新收集器預期的延遲降低可能很重要。

新收集器的詳細資訊已在 GopherCon 2015 的演講中提出。

執行時

在 Go 1.5 中,goroutine 的排程順序已更改。排程器的屬性從未由語言定義,但依賴於排程順序的程式可能會因此次更改而中斷。我們已經看到一些(錯誤的)程式受到此更改的影響。如果您的程式隱式依賴於排程順序,則需要更新它們。

另一個可能導致中斷的更改是,執行時現在將默認同時執行的執行緒數(由 GOMAXPROCS 定義)設定為 CPU 上可用的核心數。在以前的版本中,預設值為 1。不期望使用多個核心執行的程式可能會意外中斷。它們可以透過刪除限制或顯式設定 GOMAXPROCS 來更新。有關此更改的更詳細討論,請參閱設計文件

構建

既然 Go 編譯器和執行時是用 Go 實現的,就必須有一個 Go 編譯器才能從原始碼編譯發行版。因此,要構建 Go 核心,必須已經有一個工作的 Go 發行版。(不從事核心工作的 Go 程式設計師不受此更改的影響。)任何 Go 1.4 或更高版本的發行版(包括 gccgo)都可以。有關詳細資訊,請參閱設計文件

移植

主要由於業界從 32 位 x86 架構轉向,1.5 中提供的二進位制下載集有所減少。OS X 作業系統的發行版僅提供給 amd64 架構,而不是 386。同樣,Snow Leopard(Apple OS X 10.6)的埠仍然有效,但不再作為下載釋出或維護,因為 Apple 不再維護該版本的作業系統。此外,dragonfly/386 埠根本不再受支援,因為 DragonflyBSD 本身不再支援 32 位 386 架構。

但是,有幾個新的埠可以從原始碼構建。其中包括 darwin/armdarwin/arm64。新的 linux/arm64 埠大部分已到位,但 cgo 僅支援使用外部連結。

ppc64ppc64le(64 位 PowerPC,大端和小端)也作為實驗提供。這兩個埠都支援 cgo,但僅支援內部連結。

在 FreeBSD 上,Go 1.5 需要 FreeBSD 8-STABLE+,因為其新使用了 SYSCALL 指令。

在 NaCl 上,Go 1.5 需要 SDK 版本 pepper-41。由於從 NaCl 執行時移除了 sRPC 子系統,後續 pepper 版本不相容。

在 Darwin 上,可以使用 ios 構建標籤停用系統 X.509 證書介面。

Solaris 埠現在完全支援 cgo 和軟體包netcrypto/x509,以及許多其他修復和改進。

工具

翻譯

作為從樹中消除 C 的過程的一部分,編譯器和連結器從 C 翻譯為 Go。這是一個真正的(機器輔助的)翻譯,因此新程式本質上是舊程式的翻譯版本,而不是帶有新錯誤的新程式。我們相信翻譯過程幾乎沒有引入任何新錯誤,事實上還發現了許多以前未知的錯誤,現已修復。

但是,彙編器是一個新程式;它將在下面描述。

重新命名

編譯器(6g8g 等)、彙編器(6a8a 等)和連結器(6l8l 等)的程式套件已分別整合為一個工具,該工具由環境變數 GOOSGOARCH 配置。舊名稱已消失;新工具透過 go tool 機制作為 go tool compilego tool asmgo tool link 提供。此外,用於中間目標檔案的檔案字尾 .6.8 等也已消失;現在它們只是普通的 .o 檔案。

例如,要直接使用工具(而不是透過 go build)在 amd64 上為 Darwin 構建和連結程式,可以執行

$ export GOOS=darwin GOARCH=amd64
$ go tool compile program.go
$ go tool link program.o

移動

由於 go/types 包現在已移入主倉庫(見下文),vetcover 工具也已移動。它們不再在外部 golang.org/x/tools 倉庫中維護,儘管(已棄用的)原始碼仍保留在那裡以與舊版本相容。

編譯器

如上所述,Go 1.5 中的編譯器是一個從舊 C 原始碼翻譯而來的單個 Go 程式,它取代了 6g8g 等。其目標由環境變數 GOOSGOARCH 配置。

1.5 編譯器與舊編譯器基本等效,但一些內部細節已更改。一個重要的變化是常量評估現在使用 math/big 包,而不是自定義(且測試較少)的高精度算術實現。我們預計這不會影響結果。

僅對於 amd64 架構,編譯器有一個新選項 -dynlink,它透過支援引用外部共享庫中定義的 Go 符號來協助動態連結。

彙編器

與編譯器和連結器一樣,Go 1.5 中的彙編器是一個替換匯編器套件(6a8a 等)的單一程式,環境變數 GOARCHGOOS 配置架構和作業系統。與其他程式不同,彙編器是一個完全用 Go 編寫的新程式。

新彙編器與以前的彙編器幾乎相容,但有一些更改可能會影響某些彙編原始碼檔案。有關這些更改的更具體資訊,請參閱更新的彙編器指南。總而言之

首先,用於常量的表示式評估略有不同。它現在使用無符號 64 位算術,運算子(+-<< 等)的優先順序來自 Go,而不是 C。我們預計這些更改會影響極少數程式,但可能需要手動驗證。

也許更重要的是,在 SPPC 只是編號暫存器的別名(例如 ARM 上堆疊指標的 R13 和硬體程式計數器的 R15)的機器上,引用不包含符號的此類暫存器現在是非法的。例如,SP4(SP) 是非法的,但 sym+4(SP) 是可以的。在此類機器上,要引用硬體暫存器,請使用其真實的 R 名稱。

一個小的變化是,一些舊彙編器允許使用以下表示法

constant=value

定義一個命名常量。由於使用傳統的類似 C 的 #define 表示法(仍然受支援,彙編器包含一個簡化的 C 預處理器實現)總是可以做到這一點,因此該功能已刪除。

Go 1.5 中的連結器現在是一個 Go 程式,它取代了 6l8l 等。其作業系統和指令集由環境變數 GOOSGOARCH 指定。

還有其他一些變化。最重要的是增加了 -buildmode 選項,該選項擴充套件了連結樣式;它現在支援構建共享庫和允許其他語言呼叫 Go 庫等情況。其中一些已在設計文件中概述。有關可用構建模式及其用法的列表,請執行

$ go help buildmode

另一個小的變化是連結器不再在 Windows 可執行檔案的頭中記錄構建時間戳。此外,雖然這可能會修復,但 Windows cgo 可執行檔案缺少一些 DWARF 資訊。

最後,-X 標誌,它接受兩個引數,例如

-X importpath.name value

現在也接受更常見的 Go 標誌樣式,它帶有一個單獨的引數,該引數本身是一個 name=value

-X importpath.name=value

雖然舊語法仍然有效,但建議將指令碼等中此標誌的使用更新為新形式。

Go 命令

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

之前的版本引入了透過 go 命令無法匯入包內部目錄的概念。在 1.4 中,它透過在核心倉庫中引入一些內部元素進行了測試。正如設計文件中建議的那樣,該更改現在已可用於所有倉庫。規則在設計文件中解釋,但總而言之,位於或包含在名為 internal 的目錄中的任何包都可以由根植於同一子樹中的包匯入。現有包中包含名為 internal 的目錄元素可能會因此次更改而意外中斷,這就是在上次釋出時宣傳的原因。

包處理方式的另一個變化是實驗性地增加了對“vendoring”的支援。有關詳細資訊,請參閱go 命令設計文件的文件。

還有一些小改動。請閱讀文件以獲取完整詳細資訊。

  • SWIG 支援已更新,現在 .swig.swigcxx 需要 SWIG 3.0.6 或更高版本。
  • 如果存在,install 子命令現在會刪除 build 子命令在源目錄中建立的二進位制檔案,以避免樹中存在兩個二進位制檔案的問題。
  • std(標準庫)萬用字元包名現在排除命令。新的 cmd 萬用字元覆蓋命令。
  • 新的 -asmflags 構建選項設定要傳遞給彙編器的標誌。但是,-ccflags 構建選項已刪除;它特定於舊的、現已刪除的 C 編譯器。
  • 新的 -buildmode 構建選項設定構建模式,如上所述。
  • 新的 -pkgdir 構建選項設定已安裝包存檔的位置,以幫助隔離自定義構建。
  • 新的 -toolexec 構建選項允許替換不同的命令來呼叫編譯器等。這充當 go tool 的自定義替換。
  • test 子命令現在有一個 -count 標誌,用於指定每個測試和基準執行多少次。testing 包透過 -test.count 標誌在此處完成工作。
  • generate 子命令有幾個新功能。-run 選項指定一個正則表示式來選擇要執行的指令;這在 1.4 中被提出但從未實現。執行模式現在可以訪問兩個新的環境變數:$GOLINE 返回指令的源行號,$DOLLAR 擴充套件為美元符號。
  • get 子命令現在有一個 -insecure 標誌,如果從不安全的倉庫(即不加密連線的倉庫)獲取,則必須啟用該標誌。

Go vet 命令

go tool vet 命令現在對結構體標籤進行更徹底的驗證。

跟蹤命令

Go 程式現在有一個用於動態執行跟蹤的新工具。其用法類似於測試覆蓋工具的工作方式。跟蹤的生成整合到 go test 中,然後單獨執行跟蹤工具本身來分析結果

$ go test -trace=trace.out path/to/package
$ go tool trace [flags] pkg.test trace.out

這些標誌允許在瀏覽器視窗中顯示輸出。有關詳細資訊,請執行 go tool trace -help。GopherCon 2015 的此演講中也有關於跟蹤設施的描述。

Go doc 命令

幾個版本前,go doc 命令因不必要而被刪除。總是可以執行“godoc .”代替。1.5 版本引入了一個新的go doc 命令,它比 godoc 具有更方便的命令列介面。它專為命令列使用而設計,並根據呼叫為包或其元素提供更緊湊和專注的文件呈現。它還提供不區分大小寫的匹配和顯示未匯出符號文件的支援。有關詳細資訊,請執行“go help doc”。

Cgo

解析 #cgo 行時,呼叫 ${SRCDIR} 現在會擴充套件為源目錄的路徑。這允許將涉及相對於原始碼目錄的檔案路徑的選項傳遞給編譯器和連結器。如果沒有擴充套件,噹噹前工作目錄更改時,路徑將無效。

Solaris 現在完全支援 cgo。

在 Windows 上,cgo 現在預設使用外部連結。

當 C 結構體以零大小欄位結束,但結構體本身不是零大小時,Go 程式碼不再能引用該零大小欄位。任何此類引用都必須重寫。

效能

一如既往,這些變化是如此普遍和多樣,以至於很難對效能做出精確的說明。此次釋出中的變化比以往任何時候都更為廣泛,其中包括一個新的垃圾收集器和執行時到 Go 的轉換。有些程式可能會執行得更快,有些則更慢。平均而言,Go 1 基準測試套件中的程式在 Go 1.5 中比在 Go 1.4 中執行快幾個百分點,而如上所述,垃圾收集器的暫停時間顯著縮短,幾乎總是低於 10 毫秒。

Go 1.5 中的構建速度將慢大約兩倍。編譯器和連結器從 C 自動翻譯到 Go 導致了非慣用的 Go 程式碼,與編寫良好的 Go 程式碼相比,其效能較差。分析工具和重構有助於改進程式碼,但仍有許多工作要做。Go 1.6 及未來版本將繼續進行進一步的分析和最佳化。有關更多詳細資訊,請參閱這些幻燈片和相關的影片

標準庫

Flag

flag 包的 PrintDefaults 函式和 FlagSet 上的方法已修改,以建立更好的用法訊息。格式已更改為更人性化,在用法訊息中,用反引號引起來的單詞被視為要在用法訊息中顯示的標誌運算元的名稱。例如,使用以下呼叫建立的標誌,

cpuFlag = flag.Int("cpu", 1, "run `N` processes in parallel")

將顯示幫助訊息,

-cpu N
        run N processes in parallel (default 1)

此外,現在只有當預設值不是該型別的零值時才列出。

math/big 中的浮點數

math/big 包有一個新的基本資料型別 Float,它實現了任意精度浮點數。Float 值由布林符號、可變長度尾數和 32 位固定大小有符號指數表示。Float 的精度(尾數大小,以位為單位)可以顯式指定,否則由建立值的第一個操作確定。建立後,Float 的尾數大小可以用 SetPrec 方法修改。Floats 支援無窮大的概念,例如由溢位建立的無窮大,但會導致等效於 IEEE 754 NaN 的值會觸發 panic。Float 操作支援所有 IEEE-754 舍入模式。當精度設定為 24 (53) 位時,在歸一化 float32 (float64) 值範圍內保持的操作會產生與這些值上相應的 IEEE-754 算術相同的結果。

Go 型別

go/types 包迄今為止一直在 golang.org/x 倉庫中維護;從 Go 1.5 開始,它已遷移到主倉庫。舊位置的程式碼現已棄用。該包中還有一個適度的 API 更改,將在下面討論。

與此遷移相關聯,go/constant 包也移到了主倉庫;它以前是 golang.org/x/tools/exactgo/importer 包也移到了主倉庫,以及上面描述的一些工具。

網路

net 包中的 DNS 解析器幾乎總是使用 cgo 來訪問系統介面。Go 1.5 中的一項更改意味著在大多數 Unix 系統上,DNS 解析將不再需要 cgo,這簡化了在這些平臺上的執行。現在,如果系統的網路配置允許,原生 Go 解析器就足夠了。此更改的重要影響是每個 DNS 解析都佔用一個 goroutine 而不是一個執行緒,因此具有多個未完成 DNS 請求的程式將消耗更少的作業系統資源。

如何執行解析器的決定在執行時而不是構建時應用。用於強制使用 Go 解析器的 netgo 構建標籤不再必要,儘管它仍然有效。新的 netcgo 構建標籤在構建時強制使用 cgo 解析器。要在執行時強制 cgo 解析,請在環境中設定 GODEBUG=netdns=cgo。更多除錯選項記錄在此處

此更改僅適用於 Unix 系統。Windows、Mac OS X 和 Plan 9 系統行為與以前相同。

反射

reflect 包有兩個新函式:ArrayOfFuncOf。這些函式類似於現有的 SliceOf 函式,在執行時建立新型別來描述陣列和函式。

加固

透過使用 go-fuzz 工具進行隨機測試,在標準庫中發現了數十個錯誤。修復了 archive/tararchive/zipcompress/flateencoding/gobfmthtml/templateimage/gifimage/jpegimage/pngtext/template 包中的錯誤。這些修復增強了實現對不正確和惡意輸入的抵禦能力。

對庫的微小更改

  • archive/zip 包的 Writer 型別現在有一個 SetOffset 方法,用於指定在輸出流中寫入存檔的位置。
  • bufio 包中的 Reader 現在有一個 Discard 方法,用於從輸入中丟棄資料。
  • bytes 包中,Buffer 型別現在有一個 Cap 方法,用於報告緩衝區內分配的位元組數。同樣,在 bytesstrings 包中,Reader 型別現在有一個 Size 方法,用於報告底層切片或字串的原始長度。
  • bytesstrings 包現在都有一個 LastIndexByte 函式,用於在引數中定位具有該值的最右側位元組。
  • crypto 包有一個新的介面 Decrypter,它抽象了非對稱解密中使用的私鑰的行為。
  • crypto/cipher 包中,Stream 介面的文件已針對源和目標長度不同時的行為進行了澄清。如果目標短於源,則該方法將 panic。這並非實現上的更改,僅是文件上的更改。
  • 同樣在 crypto/cipher 包中,現在支援 AES 的伽羅瓦/計數器模式 (GCM) 中除 96 位元組以外的其他隨機數長度,某些協議需要這些長度。
  • crypto/elliptic 包中,CurveParams 結構體中現在有一個 Name 欄位,並且包中實現的曲線已命名。對於依賴曲線的密碼系統,這些名稱提供了一種更安全的方式來選擇曲線,而不是透過其位大小進行選擇。
  • 同樣在 crypto/elliptic 包中,Unmarshal 函式現在驗證點是否實際在曲線上。(如果不在,函式返回 nil)。此更改可以防禦某些攻擊。
  • crypto/sha512 包現在支援 SHA-512 雜湊演算法的兩個截斷版本,SHA-512/224 和 SHA-512/256。
  • crypto/tls 包的最低協議版本現在預設為 TLS 1.0。舊的預設值 SSLv3,如果需要,仍然可以透過 Config 獲得。
  • crypto/tls 包現在支援 RFC 6962 中指定的簽名證書時間戳 (SCT)。如果伺服器在 Certificate 結構中列出它們,則伺服器會提供它們;如果客戶端請求它們並存在,則在 ConnectionState 結構中公開它們。
  • 之前僅透過 OCSPResponse 方法可用的附帶 OCSP 響應到 crypto/tls 客戶端連線,現在已在 ConnectionState 結構中公開。
  • crypto/tls 伺服器實現現在將始終呼叫 Config 結構中的 GetCertificate 函式來為連線選擇證書(如果沒有提供)。
  • 最後,crypto/tls 包中的會話票證金鑰現在可以在伺服器執行時更改。這是透過 Config 型別的新 SetSessionTicketKeys 方法完成的。
  • crypto/x509 包中,萬用字元現在只在 規範中定義的 leftmost 標籤中接受。
  • 同樣在 crypto/x509 包中,未知關鍵擴充套件的處理方式已更改。它們過去會導致解析錯誤,但現在它們被解析,並且僅在 Verify 中導致錯誤。Certificate 的新欄位 UnhandledCriticalExtensions 記錄了這些擴充套件。
  • database/sql 包的 DB 型別現在有一個 Stats 方法來檢索資料庫統計資訊。
  • debug/dwarf 包有大量補充,以更好地支援 DWARF 版本 4。例如,請參見新型別 Class 的定義。
  • debug/dwarf 包現在也支援解碼 DWARF 行表。
  • debug/elf 包現在支援 64 位 PowerPC 架構。
  • encoding/base64 包現在透過兩個新的編碼變數 RawStdEncodingRawURLEncoding 支援無填充編碼。
  • encoding/json 包現在在 JSON 值不適合其要解組的目標變數或元件時返回 UnmarshalTypeError
  • encoding/jsonDecoder 型別有一個新方法,提供了一個用於解碼 JSON 文件的流式介面:Token。它還與 Decode 的現有功能互操作,後者將繼續執行已透過 Decoder.Token 啟動的解碼操作。
  • flag 包有一個新函式 UnquoteUsage,用於協助使用上述新約定建立用法訊息。
  • fmt 包中,Value 型別的值現在列印它所持有的內容,而不是使用 reflect.ValueStringer 方法,後者會生成諸如 <int Value> 之類的東西。
  • go/ast 包中的 EmptyStmt 型別現在有一個布林欄位 Implicit,它記錄分號是隱式新增的還是存在於原始碼中的。
  • 為了向前相容,go/build 包為 Go 有朝一日可能支援的多種架構保留了 GOARCH 值。這並非承諾它一定會支援。此外,Package 結構體現在有一個 PkgTargetRoot 欄位,用於儲存(如果已知)安裝時與架構相關的根目錄。
  • (新遷移的)go/types 包允許透過將新的 Qualifier 函式型別作為引數傳遞給多個函式來控制附加到包級名稱的字首。這是一個包的 API 更改,但由於它對於核心來說是新的,因此它沒有破壞 Go 1 相容性規則,因為使用該包的程式碼必須在其新位置顯式請求它。要更新,請在您的包上執行 go fix
  • image 包中,Rectangle 型別現在實現了 Image 介面,因此 Rectangle 可以用作繪圖時的掩碼。
  • 同樣在 image 包中,為了協助處理某些 JPEG 影像,現在支援 4:1:1 和 4:1:0 YCbCr 子取樣以及基本的 CMYK 支援,由新的 image.CMYK 結構體表示。
  • image/color 包添加了基本的 CMYK 支援,透過新的 CMYK 結構體、CMYKModel 顏色模型和 CMYKToRGB 函式,以滿足某些 JPEG 影像的需求。
  • 同樣在 image/color 包中,將 YCbCr 值轉換為 RGBA 變得更加精確。以前,低 8 位只是高 8 位的回聲;現在它們包含更準確的資訊。由於舊程式碼的回聲特性,uint8(r) 操作以提取 8 位紅色值有效,但這是不正確的。在 Go 1.5 中,該操作可能會產生不同的值。正確的程式碼始終是選擇高 8 位:uint8(r>>8)。順便說一句,image/draw 包為此類轉換提供了更好的支援;有關更多資訊,請參閱這篇部落格文章
  • 最後,從 Go 1.5 開始,Index 中的最接近匹配檢查現在會考慮 alpha 通道。
  • image/gif 包包含了一些泛化。多幀 GIF 檔案現在可以有一個與所有包含的單幀邊界不同的整體邊界。此外,GIF 結構體現在有一個 Disposal 欄位,用於指定每個幀的處理方法。
  • io 包添加了一個 CopyBuffer 函式,它類似於 Copy 但使用呼叫者提供的緩衝區,允許控制分配和緩衝區大小。
  • log 包有一個新的 LUTC 標誌,它會導致時間戳以 UTC 時區列印。它還為使用者建立的記錄器添加了一個 SetOutput 方法。
  • 在 Go 1.4 中,Max 未檢測到所有可能的 NaN 位模式。這在 Go 1.5 中已修復,因此在包含 NaN 的資料上使用 math.Max 的程式可能會表現出不同的行為,但現在根據 IEEE754 對 NaN 的定義是正確的。
  • math/big 包為整數添加了一個新的 Jacobi 函式,併為 Int 型別添加了一個新的 ModSqrt 方法。
  • mime 包添加了一個新的 WordDecoder 型別來解碼包含 RFC 204 編碼單詞的 MIME 頭。它還提供了 BEncodingQEncoding 作為 RFC 2045 和 RFC 2047 編碼方案的實現。
  • mime 包還添加了一個 ExtensionsByType 函式,該函式返回已知與給定 MIME 型別相關聯的 MIME 副檔名。
  • 有一個新的 mime/quotedprintable 包,它實現了 RFC 2045 定義的 quoted-printable 編碼。
  • net 包現在將透過依次嘗試每個 IP 地址直到成功來 Dial 主機名。Dialer.DualStack 模式現在透過給第一個地址族 300 毫秒的先行時間來實現 Happy Eyeballs (RFC 6555);此值可以透過新的 Dialer.FallbackDelay 覆蓋。
  • net 包中錯誤返回的型別存在的一些不一致之處已得到整理。大多數現在返回一個 OpError 值,其中包含比以前更多的資訊。此外,OpError 型別現在包含一個 Source 欄位,用於儲存本地網路地址。
  • net/http 包現在支援從伺服器 Handler 設定尾部。有關詳細資訊,請參閱 ResponseWriter 的文件。
  • 透過設定新的 Request.Cancel 欄位,現在有一種取消 net/http Request 的新方法。它受 http.Transport 支援。Cancel 欄位的型別與 context.Context.Done 返回值相容。
  • 同樣在 net/http 包中,有一段程式碼用於忽略 TimeServeContent 函式中的零值。從 Go 1.5 開始,它現在也忽略等於 Unix 紀元的時間值。
  • net/http/fcgi 包匯出了兩個新錯誤:ErrConnClosedErrRequestAborted,用於報告相應的錯誤情況。
  • net/http/cgi 包有一個錯誤,它錯誤處理了環境變數 REMOTE_ADDRREMOTE_HOST 的值。這已得到修復。此外,從 Go 1.5 開始,該包設定了 REMOTE_PORT 變數。
  • net/mail 包添加了一個 AddressParser 型別,可以解析郵件地址。
  • net/smtp 包現在有一個 TLSConnectionState 訪問器,用於 Client 型別,它返回客戶端的 TLS 狀態。
  • os 包有一個新的 LookupEnv 函式,它類似於 Getenv,但可以區分空環境變數和缺失環境變數。
  • os/signal 包添加了新的 IgnoreReset 函式。
  • runtimeruntime/tracenet/http/pprof 包各自有新函式來支援上述跟蹤設施:ReadTraceStartTraceStopTraceStartStopTrace。請參閱各自的文件瞭解詳細資訊。
  • runtime/pprof 包預設現在在所有記憶體配置檔案中包含總體記憶體統計資訊。
  • strings 包有一個新的 Compare 函式。此函式的存在是為了與 bytes 包保持對稱,但由於字串本身支援比較,因此在其他方面是不必要的。
  • sync 包中的 WaitGroup 實現現在診斷程式碼,該程式碼在呼叫 Add 和從 Wait 返回之間存在競爭。如果檢測到此情況,實現會 panic。
  • syscall 包中,Linux SysProcAttr 結構體現在有一個 GidMappingsEnableSetgroups 欄位,這是 Linux 3.19 中安全更改所必需的。在所有 Unix 系統上,該結構體還具有新的 ForegroundPgid 欄位,以便在執行時提供更多控制。在 Darwin 上,現在有一個 Syscall9 函式來支援具有過多引數的呼叫。
  • testing/quick 現在將為指標型別生成 nil 值,從而可以與遞迴資料結構一起使用。此外,該包現在支援生成陣列型別。
  • text/templatehtml/template 包中,過大而無法表示為 Go 整數的整數常量現在會觸發解析錯誤。以前,它們被悄悄地轉換為浮點數,從而丟失了精度。
  • 同樣在 text/templatehtml/template 包中,一個新的 Option 方法允許自定義模板在執行期間的行為。唯一實現的選項允許控制在索引 map 時如何處理缺失的鍵。預設值(現在可以覆蓋)與以前一樣:繼續使用無效值。
  • time 包的 Time 型別有一個新方法 AppendFormat,可用於在列印時間值時避免分配。
  • unicode 包和整個系統中的相關支援已從 7.0 版升級到 Unicode 8.0