Go 1 釋出前的歷史記錄
本頁面總結了 Go 1 之前 Go 穩定版本之間的更改。有關最新版本的說明,請參閱釋出歷史頁面。
r60(釋出於 2011/09/07)
r60 版本對應於 weekly.2011-08-17
。本節重點介紹此版本中最重大的更改。有關更詳細的摘要,請參閱每週釋出說明。有關完整資訊,請參閱Mercurial 更改列表。
語言
現在,除非“else”塊的主體是另一個“if”,否則“else”塊必須有大括號。由於 gofmt 無論如何都會新增這些大括號,因此 gofmt 格式化的程式不會受到影響。要修復其他程式,請執行 gofmt。
軟體包
http 包的 URL 解析和查詢轉義程式碼(例如 ParseURL
和 URLEscape
)已移至新的url 包,並對名稱進行了一些簡化。客戶端程式碼可以使用 gofix 自動更新。
image 包中 image.RGBA 和 image.NRGBA 等結構型別的 Pix
欄位已發生重大更改。但是,image.Image 介面型別沒有更改,如果您沒有明確引用 Pix
欄位,則無需更改程式碼。例如,如果您使用 image/jpeg 包解碼多個影像,使用 image/draw 組合它們,然後使用 image/png 編碼結果,那麼您的程式碼應該仍然像以前一樣工作。如果您的程式碼確實引用了 Pix
欄位,請參閱weekly.2011-07-19 快照說明,瞭解如何更新程式碼。
template 包已替換為新的模板包(以前是 exp/template
)。原始的 template 包仍然作為 old/template 提供。old/template
包已被棄用並將被刪除。Go 樹已更新為使用新的 template 包。我們鼓勵 old template 包的使用者切換到新的 template 包。使用 template
或 exp/template
的程式碼需要將其匯入行分別更改為 "old/template"
或 "template"
。
工具
Goinstall 現在使用新的標籤選擇方案。在下載或更新時,goinstall 會查詢帶有 "go."
字首且與本地 Go 版本對應的標籤或分支。對於 Go release.r58
,它查詢 go.r58
。對於 weekly.2011-06-03
,它查詢 go.weekly.2011-06-03
。如果未找到特定的 go.X
標籤或分支,它會選擇最近的早期版本。如果找到合適的標籤或分支,goinstall 會使用該版本的程式碼。否則,它會使用版本控制系統選擇的預設版本。鼓勵庫作者在其儲存庫中使用適當的標籤或分支名稱,以使他們的庫更易於訪問。
次要修訂
r60.1 包含一個連結器修復、一對goplay修復、一個 json
包修復和一個新的結構體標籤選項。
r60.2 修復了一個涉及 map 的記憶體洩漏。
r60.3 修復了一個反射錯誤。
r59(釋出於 2011/08/01)
r59 版本對應於 weekly.2011-07-07
。本節重點介紹此版本中最重大的更改。有關更詳細的摘要,請參閱每週釋出說明。有關完整資訊,請參閱Mercurial 更改列表。
語言
此版本包含一項語言更改,限制了 goto
的使用。本質上,塊外的 goto
語句不能跳轉到塊內的標籤。如果您的程式碼使用了 goto
,可能需要進行更改。請參閱此變更集,瞭解新規則對 Go 樹的影響。
軟體包
像往常一樣,gofix 將處理這些包 API 更改所需的大部分重寫。
http 包有一個新的 FileSystem 介面,提供檔案訪問。現在 FileServer 輔助函式接受一個 FileSystem
引數,而不是顯式的檔案系統根目錄。透過實現您自己的 FileSystem
,您可以使用 FileServer
來提供任意資料。
os 包的 ErrorString
型別已被隱藏。os.ErrorString
的大多數用法都可以替換為 os.NewError。
reflect 包支援一種新的結構體標籤方案,該方案允許在多個包之間共享結構體標籤。在此方案中,標籤必須採用以下形式
`key:"value" key2:"value2"`
StructField 型別的 Tag 欄位現在具有 StructTag 型別,它有一個 Get
方法。 json 和 xml 的客戶端需要更新。程式碼中的
type T struct { X int "name" }
應變為
type T struct { X int `json:"name"` // or `xml:"name"` }
使用 govet 來識別需要更改以使用新語法的結構體標籤。
sort 包的 IntArray
型別已重新命名為 IntSlice,Float64Slice 和 StringSlice 也類似。
strings 包的 Split
函式已拆分為 Split 和 SplitN。SplitN
與舊的 Split
相同。新的 Split
等效於最終引數為 -1 的 SplitN
。
工具
Goinstall 現在可以從任意遠端倉庫(不僅僅是 Google Code、GitHub 等)安裝包和命令。有關詳細資訊,請參閱 goinstall 文件。
r58(釋出於 2011/06/29)
r58 版本對應於 weekly.2011-06-09
並附加了錯誤修復。本節重點介紹此版本中最重大的更改。有關更詳細的摘要,請參閱每週釋出說明。有關完整資訊,請參閱Mercurial 更改列表。
語言
此版本修復了濫用 goto
的程式中未初始化記憶體的使用。
軟體包
像往常一樣,gofix 將處理這些包 API 更改所需的大部分重寫。
http 包從 Client.Get 方法中刪除了 finalURL
返回值。該值現在可透過 http.Response 上的新 Request
欄位獲取。型別 map[string][]string 的大多數例項已替換為新的 Values 型別。
exec 包已重新設計,具有更方便簡潔的 API。
strconv 包的 Quote 函式現在只轉義那些不被 unicode.IsPrint 分類為可列印的 Unicode 碼點。以前 Quote 會轉義所有非 ASCII 字元。這也影響 fmt 包的 "%q"
格式化指令。以前的引用行為仍然可透過 strconv 的新 QuoteToASCII 函式獲得。
os/signal 包的 Signal 和 UnixSignal 型別已移至 os 包。
image/draw 包是 exp/draw
的新名稱。exp/draw
中與 GUI 相關的程式碼現在位於 exp/gui 包中。
工具
Goinstall 現在遵循 GOPATH 環境變數,以便在 Go 樹之外構建和安裝您自己的程式碼和外部庫(並避免編寫 Makefiles)。
次要修訂
r58.1 增加了構建和執行時更改,以使 Go 在 OS X 10.7 Lion 上執行。
r57(釋出於 2011/05/03)
r57 版本對應於 weekly.2011-04-27
並附加了錯誤修復。本節重點介紹此版本中最重大的更改。有關更詳細的摘要,請參閱每週釋出說明。有關完整資訊,請參閱Mercurial 更改列表。
新的 gofix 工具查詢使用舊 API 的 Go 程式,並將其重寫為使用新 API。更新到新的 Go 版本後,gofix 有助於對您的程式進行必要的更改。Gofix 將處理下面描述的 http、os 和 syscall 包更改,我們將更新程式以跟上未來庫的更改。Gofix 無法完美處理所有情況,因此在提交更改之前請閱讀並測試它所做的更改。有關更多資訊,請參閱gofix 部落格文章。
語言
多重賦值語法取代了 closed
函式。通道接收的語法允許一個可選的第二個賦值值,一個布林值,指示通道是否已關閉。此程式碼
v := <-ch if closed(ch) { // channel is closed }
現在應寫成
v, ok := <-ch if !ok { // channel is closed }
未使用的標籤現在是非法的,就像未使用的區域性變數一樣。
軟體包
gob 包現在將編碼和解碼實現 GobEncoder 和 GobDecoder 介面的型別的值。這允許具有未匯出欄位的型別傳輸自洽描述;示例包括 big.Int 和 big.Rat。
http 包已重新設計。對於客戶端,有新的 Client 和 Transport 抽象,可以更好地控制 HTTP 細節,例如傳送的標頭和遵循的重定向。這些抽象使得實現新增 OAuth2 等功能的自定義客戶端變得容易。對於伺服器,ResponseWriter 已刪除了其非必要方法。Hijack 和 Flush 方法不再是必需的;程式碼可以透過檢查特定值是否實現了 Hijacker 或 Flusher 來測試它們。RemoteAddr 和 UsingTLS 方法被 Request 的 RemoteAddr 和 TLS 欄位替換。SetHeader 方法被 Header 方法替換;其結果,型別為 Header,實現了 Set 和其他方法。
net 包刪除了 Dial 中的 laddr
引數,並刪除了 LookupHost 中的 cname
返回值。現在,在可能的情況下,實現使用 cgo 來使用 C 庫 getaddrinfo(3) 函式實現網路名稱查詢。這確保 Go 和 C 程式以相同的方式解析名稱,並避免了 OS X 應用程式級防火牆。
os 包引入了簡化的 Open 和 Create 函式。原始的 Open 現在作為 OpenFile 提供。StartProcess 的最後三個引數已替換為指向 ProcAttr 的指標。
reflect 包已重新設計。Type 現在是一個介面,實現了所有可能的型別方法。現在不是對 Type t
進行型別 switch,而是對 t.Kind()
進行 switch。Value 現在是一個結構體值,實現了所有可能的值方法。現在不是對 Value v
進行型別 switch,而是對 v.Kind()
進行 switch。Typeof 和 NewValue 現在分別稱為 TypeOf 和 ValueOf。要建立可寫的 Value,請使用 New(t).Elem()
而不是 Zero(t)
。有關完整詳細資訊,請參閱更改說明。新的 API 允許更高效地實現 Value,避免了以前 API 所需的許多分配。
請記住,gofix 將處理這些包 API 更改所需的大部分重寫。
工具
新的命令 Gofix 已在上面描述。
Gotest 現在是一個 Go 程式,而不是 shell 指令碼。新的 -test.short
標誌與包 testing 的 Short 函式結合使用,允許您編寫可以在正常或“短”模式下執行的測試;all.bash 以短模式執行測試以減少安裝時間。Makefiles 知道該標誌:使用 make testshort
。
執行時支援現在實現了 CPU 和記憶體分析。Gotest 的新 -test.cpuprofile
和 -test.memprofile
標誌使得分析測試變得容易。要為您的 Web 伺服器新增分析功能,請參閱 http/pprof 文件。對於其他用途,請參閱 runtime/pprof 文件。
次要修訂
r57.1 修復了 http.FormFile 中的 nil 指標解引用。
r57.2 修復了 濫用 goto
的程式中未初始化記憶體的使用。
r56(釋出於 2011/03/16)
r56 版本是第一個穩定版本,對應於 weekly.2011-03-07.1
。編號從 56 開始,因為在此版本之前,我們現在認為是每週快照的被稱為版本。