Skip to content

Go更新日志

維護版本:

  • go1.25,首次發布:2025-08-12,最後更新:go1.25.0 (2025-08-12)
  • go1.24,首次發布:2025-02-11,最後更新:go1.24.6 (2024-08-06)

Go 語言官方更新日志:Release History - The Go Programming Language

Go 官方采用語義化版本來進行版本標識,格式為 v主版本.次版本.補丁版本 (見Semantic Versioning),主版本的更新意味著發生了 Breaking Change,即無法向下兼容的更新,次版本的更新意味著有新功能添加同時保持向下兼容,補丁版本的更新意味著有問題被修復同時保持向下兼容。

Go 團隊每半年發布一個二級版本,並且只有最新的兩個二級版本是長期維護,維護時間都是六個月,鑑於 Go 每一次更新都保持著相當高的兼容性,建議在新版本穩定後及時將 Go 升級到最新版。

Go2.0 上一次提出草案是在 2018 年 11 月 19 日,那時還是處於 go1.13 版本,五年過後,版本已經迭代到了 go1.21,Go2.0 的各種想法已經通過增量更新的方式體現在了 Go1.0 上,創始人之一也曾明確表示未來可能並不會有 Go2.0,Go 將一直為保持向下兼容而努力(見Go 1 and the Future of Go Programs)。

提示

此頁面只是對官方日志的一個簡單搬運,不定期更新,想獲取最新消息還請前往官網。

1.25

首次發布:2025-08-12

最後更新:go1.25.0 (2025-08-12)

go1.25 版本的詳細更新日志可以前往Go 1.24 Release Notes 查看,在其維護期間發布的所有補丁版本可以前往Go1.25 - Release Patch了解。

語言層面

  1. 移除了泛型中的核心類型的概念(core type),見官方博文Goodbye core types

標准庫

  1. 新增test/synctest,用於測試並發代碼
  2. 新增實驗庫encoding/json/v2,包含了:
    • encoding/json/v2 ,反序列化速度較於v1提升2-10倍左右,基准測試見go-json-experiment/jsonbench
    • encoding/json/jsontext,提供了與json字符串低級交互的能力

工具鏈

  1. 後續的Go發行版將會包含少量的預構建二進制工具
  2. go mod新增ignore指令,用於指定go命令應該忽略的文件夾
  3. go doc -http 可以啟動一個本地的http server,查看代碼文檔
  4. go vet,新增 waitgrouphostport分析器
  5. 當go命令行更新go.modgo.work中的go版本時,不再添加指定的 go toolchain version

運行時

  1. GOMAXPROCS在容器環境中會感知容器CPU限制

  2. 新版實驗GCgreenteagc,GC的基本調度單位從object變成了memoery span

  3. 當panic未捕獲時,不再重復打印

    panic: PANIC [recovered]
      panic: PANIC

    變為

    panic: PANIC [recovered, repanicked]
  4. 新增 runtime/trace.FlightRecorder,能夠以更輕量的方式持續捕獲運行時執行信息

編譯器

  1. 修復了1.21空指針延遲檢查(延遲到錯誤檢查以後)的bug,下面這個一眼有問題的代碼,在1.25版本以前能夠正常運行

    go
    package main
    
    import "os"
    
    func main() {
    	f, err := os.Open("nonExistentFile")
    	name := f.Name()
    	if err != nil {
    		println("should panic") // 1.25以前會輸出這一行
    		return
    	}
    	println(name)
    }
  2. 編譯器會對位於棧上的slice預留更多後備內存,以提高使用性能

  3. 支持生成DWARF5調試信息

1.24

首次發布:2025-02-11

最後更新:go1.24.6 (2025-08-06)

go1.24 版本的詳細更新日志可以前往Go 1.24 Release Notes 查看,在其維護期間發布的所有補丁版本可以前往Go1.24 - Release Patch了解。

語言層面

  1. 泛型類型別名,允許為泛型類型創建別名,這在引用第三方定義的泛型類型時非常有用,例如

    go
    import (
        "other"
    )
    
    type MyQuque[T any] = other.Queue[T]

標准庫

  1. 新增 weak 包:提供弱指針(Weak Pointers),允許對象在不增加引用計數的情況下被引用,避免緩存導致的內存洩漏,使用前需檢查指針是否為 nil
  2. 文件系統訪問限制:引入 os.Root 類型,限制文件操作在特定目錄內,增強安全性
  3. 加密與哈希支持:新增 crypto/mlkemcrypto/hkdfcrypto/pbkdf2crypto/sha3 包,優化現有加密算法性能
  4. 新增基准測試函數 testing.B.Loop,以更好的進行循環測試
  5. encoding/json :新增 omitzero 標簽,支持基於 IsZero() 方法的零值過濾
  6. stringsbytes:新增迭代器函數(如 LinesSplitSeqFieldsSeq

運行時

  1. 基於Swiss Tables重構內置map,大型map訪問速度提升30%,迭代速度提升10%-60%
  2. sync.Map 改用並發哈希 Trie(hash-trie)以優化性能,尤其是在並發寫的情況
  3. 運行時內部的互斥鎖采用新的spinbit實現,降低了鎖競爭,提升高並發場景性能
  4. 優化小對象分配策略,減少內存碎片和GC暫停時間
  5. 新增 runtime.AddCleanup 替代 runtime.SetFinalizer,支持為對象注冊多個清理函數,並在獨立 goroutine 中順序執行

Cgo

  1. 支持 #cgo noescape#cgo nocallback 注解,分別聲明 C 函數不逃逸內存和不回調 Go 函數,提升運行時性能
  2. Cgo 現在將拒絕編譯對具有多個不兼容聲明的 C 函數的調用,嚴格檢測跨文件的不兼容 C 函數聲明(如 void f(int)void f(double)),避免生成錯誤調用序列

工具鏈

  1. 模塊工具依賴管理:通過 go.mod 的 tool 指令跟蹤工具依賴,替代傳統的 tools.go 空導入方案
  2. 結構化輸出:go build 和 go test 支持 -json 標志,輸出 JSON 格式的構建和測試結果
  3. 編譯與鏈接優化:編譯器生成代碼效率提升,鏈接器默認生成 GNU Build ID(ELF 平台)和 UUID(macOS)
  4. 禁止通過別名繞過對 CGO 生成類型的方法定義限制
  5. go build 自動嵌入版本控制系統信息到二進制文件(支持 -buildvcs=false 禁用)
  6. GOAUTH 環境變量支持私有模塊認證。
  7. go.mod 支持 tool 指令管理可執行依賴,替代 tools.go 空白導入
  8. 新增 go get -tool參數 和 go install tool 命令管理模塊工具依賴
  9. 構建緩存支持 go rungo tool 的二進制緩存
  10. objdump 支持 LoongArch、RISC-V、S390X 反匯編
  11. vet 新增 tests 分析器(檢測測試函數簽名錯誤)

平台兼容性

  1. macOS:Go 1.24 為最後一個支持 macOS 11 Big Sur 的版本,Go 1.25 將要求 macOS 12+
  2. Windows:將 32 位 ARM 架構標記為不完整的(GOOS=windows GOARCH=arm),見 issue #70705
  3. Linux:最低內核版本要求升級至 3.2
  4. 要求 Go 1.22.6+ 作為引導工具鏈

廢棄

  1. math/rand.Seed()徹底失效,需通過 GODEBUG=randseednop=0 恢復舊行為。
  2. runtime.GOROOT()標記為棄用,推薦通過go env GOROOT獲取路徑

1.23

首次發布:2024-08-13

最後更新:go1.23.4 (2024-12-03)

go1.23 版本的詳細更新日志可以前往Go 1.23 Release Notes查看,在其維護期間發布的所有補丁版本可以前往Go1.23 - Release Patch了解。

語言層面

  1. for range 支持迭代器函數,詳細信息查看Go Wiki: Rangefunc Experiment

    go
    func Upper(s []string) iter.Seq2[int, string] {
      return func(yield func(int, string) bool) {
        for i, s1 := range s {
          if !yield(i, strings.ToUpper(s1)) {
            return
          }
        }
        return
      }
    }
    
    func main() {
      sl := []string{"hello", "world", "golang"}
      for i, s := range Upper(sl) {
        fmt.Printf("%d : %s\n", i, s)
      }
    }
    
    //0 : HELLO
    //1 : WORLD
    //2 : GOLANG

    這是一個比較實用的特性,一般會結合泛型來用。

標准庫

  1. 新增標准庫iter,它定義和描述了關於迭代器的詳細信息

  2. maps庫新增了若干個迭代器函數

  3. slices庫新增了若干個迭代器函數

  4. 新增structs庫,提供了可以修改結構體屬性的能力,比如內存布局

    go
    type Person struct {
      Name string
      Age  int
      _    structs.HostLayout
    }
  5. 優化了time標准庫的實現

Linker

  1. 處理//go:linkname的濫用,對於一些經常被引用的 API 暫時允許其存在,比如runtime.memhash64runtime.nanotime等等,此後對於其他的新引用將不會允許。

    go
    //go:linkname gcinit runtime.gcinit
    func gcinit()
    
    func main() {
      gcinit()
    }

    像這種代碼就無法通過編譯

    link: main: invalid reference to runtime.gcinit

工具鏈

  1. 新增go telemetry 命令用於遙測數據管理

1.22

首次發布:2024-02-06

最後更新:go1.22.6(released 2024-08-06)

go1.22 版本的詳細更新日志可以前往Go 1.22 Release Notes查看,在其維護期間發布的所有補丁版本可以前往Go1.22 - Release Patch了解。

語言層面

  1. 解決了 go 語言循環變量的問題

    go
    func main() {
      var wg sync.WaitGroup
      const n = 10
      wg.Add(n)
      for i := 0; i < n; i++ {
        go func() {
          fmt.Println(i)
          wg.Done()
        }()
      }
      wg.Wait()
    }

    這段代碼在 1.22 前,會輸出 10 個 9,在 1.22 後則會正常輸出 0 到 9。

  2. for range現在支持迭代數字類型,如下

    go
    for i := range 10 {
      fmt.Println(i)
    }

標准庫

  1. 增強了net/http標准庫的路由

  2. database/sql新增了sql.Null泛型類型

    go
    type Null[T any] struct {
      V     T
      Valid bool
    }

    使用如下

    go
    type Person struct {
      Name sql.Null[string]
      Age  sql.Null[int]
    }

1.21

首次發布:2023-08-08

最後更新:go1.21.13 (released 2024-08-06)

go1.21 版本的詳細更新日志可以前往Go 1.21 Release Notes查看,在其維護期間發布的所有補丁版本可以前往Go1.21 - Release Patch了解。

語言層面

  1. 新增了兩個內置函數minmax,用於計算最大值最小值。

  2. 新增內置函數clear,用於清空 map 和 slice

  3. 更新了package初始化順序

    • 按導入路徑對所有包進行排序
    • 重復執行,直到包的列表為空
    • 找到列表中所有的導入都已被初始化的第一個包
    • 初始化該包並將其從列表中刪除
  4. 提高和改進了類型推理的能力和精度,主要是泛型相關。

  5. 推出了for range循環變量改進的預覽版本,這是一個困擾了 Go 開發者接近十年的問題,官方終於要解決了,詳情見:LoopvarExperiment · golang/go Wiki (github.com)Proposal: Less Error-Prone Loop Variable Scoping (googlesource.com)

  6. 保證了recover的返回值不會是nil,如果在調用panic時參數為nil,則會觸發另一個panic,返回*runtime.PanicNilError。為了兼容性,在編譯時設置GODEBUG=panicnil=1允許向panic傳入nil

標准庫

  1. 新增log/slog庫,提供標准的結構化日志庫
  2. 新增testing/slogtest庫,用於驗證slog.Handler的實現
  3. 新增slices庫,提供了一系列泛型函數用於操作切片。
  4. 新增maps庫,提供了一系列泛型函數用於操作 map
  5. 新增cmp庫,用於比較有序類型。

其他

  1. go1.21.0 至少在 windows 系統上至少需要 win10 或者 Windows Server 2016 版本以上才能運行,先前的版本不再支持。
  2. go1.21.0 至少需要在 macOS 10.15 Catalina 或者更新的版本才能運行,先前的版本不再支持。
  3. 新增了實驗性的 WebAssembly System Interface,Go 依舊在 WASM 這塊不斷的探索。
  4. 在 1.20 還是實驗性質的(Profile-guide optimization)PGO(見Profile-guided optimization - The Go Programming Language),1.21 版本正式啟用。在 main 包下包含default.pgo文件會啟用該功能,開啟後性能可能會提升 2%-7%。
  5. 當打印非常深的運行時調用棧時,從原來的只打印前一百個幀,到現在分別打印前 50 的最後的 50 個幀。
  6. 優化了在 Unix 平台 CGO 的調用性能,從 1-3 微秒優化到了現在的 100-200 納秒。
  7. 在 1.21 版本,編譯速度提升了接近 6%,這主要歸功於編譯器本身使用 PGO 來構建。

1.20

首次發布:2023-02-01

最後更新:go1.20.14 (released 2024-02-06)

go1.20 版本的詳細更新日志可以前往Go 1.20 Release Notes查看,在其維護期間發布的所有補丁版本可以前往Go1.20 - Release Patch了解。

語言層面

  1. 在將切片類型轉換為數組時,原來需要對指針數組解引用*(*[4byte])(x)來避免和切片操作同一個底層數組,現在可以直接這麼寫[4]byte(x)
  2. unsafe新增了SliceDataStringStringData函數,用於構建和結構切片與字符串值。

標准庫

  1. 新增crypto/ecdh庫,提供了對於 ECDH(Elliptic Curve Diffie-Hellman,一種非對稱加密方法)的支持。
  2. go1.20 擴展了對 error 包裝的支持,允許一個 error 包裝多個 error。
  3. 新增net/http.ResponseContorller,提供了一種更清晰、更易於發現的方法來添加每個 handler controls。
  4. httputil.ReverseProxy包含了一個新的 Rewrite Hook 函數,用於取代之前的 Director Hook。

其他

  1. go1.20 是最後一個支持 win7,8,Server2008 和 Server2012 的版本,在未來版本中不再提供支持。
  2. go1.20 是最後一個支持 macOS 10.13 或 10.14 的版本,未來版本將不再提供支持。
  3. 在 1.18 和 1.19 版本中,由於泛型的出現,相較於 1.17 編譯速度出現了倒退,go1.20 編譯速度將會提升 10%左右。
  4. 發布 PGO(Profile-guided optimization)的預覽版本,這是一種計算機界的編譯器優化技術,可以提高運行時性能。
  5. 在 go1.20,在沒有 C toolchains 的系統上,go command 禁用 cgo。
  6. 支持收集程序代碼覆蓋率文件,見Coverage profiling support for integration tests - The Go Programming Language
  7. 對 GC 進行了改進,提高了穩定性,減少內存開銷,提升了整體 2%的 CPU 性能。

1.19

首次發布:2022-08-02

最後更新:go1.19.13 (released 2023-09-06)

go1.19 版本的詳細更新日志可以前往Go 1.19 Release Notes查看,在其維護期間發布的所有補丁版本可以前往Go1.19 - Release Patch了解。

重要變化

  1. 內存模型向 c/c++看齊,類似於 TcMollcate

  2. sync/atomic包現在提供了更多的類型可供使用

  3. 支持使用runtime/debug.SetMemoryLimit函數對 go 內存進行軟限制,在某些情況下可以提供內存利用效率

  4. 運行時現在會根據協程棧的平均使用情況來選擇一個合適的大小為其初始化棧空間內存,這樣可以避免頻繁的棧擴容縮容

1.18

首次發布:2022-03-15

最後更新:go1.18.10 (released 2023-01-10)

go1.18 版本的詳細更新日志可以前往Go 1.18 Release Notes查看,在其維護期間發布的所有補丁版本可以前往Go1.18 - Release Patch了解。

語言層面

  1. 重量級更新,支持泛型,類型集接口,參數類型約束

其它

  1. 優化了append函數的擴容行為
  2. 新增debug/buildinfo包,可以在運行時獲取 go 程序的構建信息
  3. gofmt 現在可以並發的格式化源文件

1.17

首次發布:2021-08-16

最後更新:go1.17.13 (released 2022-08-01)

go1.17 版本的詳細更新日志可以前往Go 1.17 Release Notes查看,在其維護期間發布的所有補丁版本可以前往Go1.17 - Release Patch了解。

語言層面

  1. 新增unsafe.Add函數,支持指針運算
  2. 新增unsafe.Slice函數,支持獲取切片的底層數組的指針
  3. 切片現在可以轉換為數組指針類型,[]T => *[N]T,前提是數組的長度要小於等於切片的長度

1.16

首次發布:2021-02-16

最後更新:go1.16.15 (released 2022-03-03)

go1.16 版本的詳細更新日志可以前往Go 1.16 Release Notes查看,在其維護期間發布的所有補丁版本可以前往Go1.16 - Release Patch了解。

重要變化

該版本沒什麼重要的語法上的變更,一些重要的變化如下

  1. 棄用ioutil
  2. 支持通過//go:embed指令來將一些靜態文件嵌入到程序中
  3. 新增io/fs.Fs類型,對文件系統進行了更好的抽象

1.15

首次發布:2020-08-11

最後更新:go1.15.15 (released 2021-08-05)

go1.15 版本的詳細更新日志可以前往Go 1.15 Release Notes查看,在其維護期間發布的所有補丁版本可以前往Go1.15 - Release Patch了解。

重要變化

該版本沒什麼重要的語法上的變更,一些重要的變化如下

  1. 優化了小對象的分配效率

  2. 新增了包time/tzdata,通過下面的方式支持將時區數據庫嵌入到程序中,因為有很多系統本地並沒有時區數據信息。

    go
    improt _ "time/tzdata"
  3. 對 go 鏈接器做出了重大改進,減少了其資源使用,並提高了代碼的健壯性

  4. 在某些情況下,允許unsafe.Pointer轉換為uinptr

1.14

首次發布:2020-02-25

最後更新:go1.14.15 (released 2021-02-04)

go1.14 版本的詳細更新日志可以前往Go 1.14 Release Notes查看,在其維護期間發布的所有補丁版本可以前往Go1.14 - Release Patch了解。

語言層面

  1. 支持方法集接口類型嵌套

    go
    type MyIO interface {
      io.WriteCloser
    }

其它

  1. 引用了開放編碼優化,defer調用的開銷降低至幾乎跟原生調用一樣
  2. 支持協程間的異步搶佔,沒有函數調用的循環將不會再永久阻塞調度

1.13

首次發布:2019-09-03

最後更新:go1.13.15 (released 2020-08-06)

go1.13 版本的詳細更新日志可以前往Go 1.13 Release Notes查看,在其維護期間發布的所有補丁版本可以前往Go1.13 - Release Patch了解。

語言層面

  1. 支持更現代的數字字面量,比如

    go
    0b101 // 二進制
    0o10 // 十進制
    0x1B // 十六進制

    支持下劃線分割數字以帶來更好的可讀性

    go
    10_000

    虛數i的後綴現在可以是任何的二進制,十進制,十六進制,或浮點數數字

其它

  1. GO111MODULE值默認為auto
  2. 新增GOPRIVATE環境變量來支持私有的依賴源
  3. 新增GOSUMDB環境環境
  4. defer的使用開銷降低了 30%
  5. 當發生索引下標越界時,panic現在會打印出下標信息
  6. go 下載依賴時會進行語義化版本驗證

1.12

首次發布:2019-02-25

最後更新:go1.12.17 (released 2020-02-12)

go1.12 版本的詳細更新日志可以前往Go 1.12 Release Notes查看,在其維護期間發布的所有補丁版本可以前往Go1.12 - Release Patch了解。

重要變化

該版本沒什麼重要的語法上的變更,一些重要的變化如下

  1. 顯著提高了堆的掃描性能
  2. 運行時將更積極的向操作系統釋放申請的內存
  3. 用於下載 go 依賴的命令現在可以並發安全的使用

1.11

首次發布:2018-08-24

最後更新:go1.11.13 (released 2019-08-13)

go1.11 版本的詳細更新日志可以前往Go 1.11 Release Notes查看,在其維護期間發布的所有補丁版本可以前往Go1.11 - Release Patch了解。

重要變化

該版本沒什麼重要的語法上的變更,一些重要的變化如下

  1. GoMod 首次發布,此前依賴管理的混亂局面將要結束
  2. 首次實驗性的支持了 WASM
  3. 運行時采用稀疏堆布局,不再限制堆大小

1.10

首次發布:2018-02-16

最後更新:go1.10.8 (released 2019-01-23)

go1.10 版本的詳細更新日志可以前往Go 1.10 Release Notes查看,在其維護期間發布的所有補丁版本可以前往Go1.10 - Release Patch了解。

重要變化

該版本沒什麼重要的語法上的變更,一些重要的變化如下

  1. go install命令現在只用於安裝和編譯命令行工具,不再用於下載依賴
  2. go get命令現在用於下載源碼依賴
  3. go 測試現在會緩存測試結果,並且會在運行前自動運行go vet
  4. 顯著降低了 GC 在活躍時造成的延時

1.9

首次發布:2017-08-24

最後更新:go1.9.7 (released 2018-06-05)

go1.9 版本的詳細更新日志可以前往Go 1.9 Release Notes查看,在其維護期間發布的所有補丁版本可以前往Go1.9 - Release Patch了解。

語言層面

  1. 支持類型別名

其它

  1. 支持並行編譯
  2. 新增並發安全的sync.Map

1.8

首次發布:2017-02-16

最後更新:go1.8.7 (released 2018-02-07)

go1.8 版本的詳細更新日志可以前往Go 1.8 Release Notes查看,在其維護期間發布的所有補丁版本可以前往Go1.8 - Release Patch了解。

語言層面

  1. 當兩個結構體進行類型轉換時,會忽略結構體 tag 的不同

    go
    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
    }

其它

  1. 垃圾收集造成的暫停時間低至 10 微秒,大部分情況下低於 100 微秒(可以看到幾乎每個版本 go 都在努力改進 GC)
  2. 調用defer的開銷減少了接近一半
  3. go 調用 c 的開銷減少了接近一半
  4. 優化了 map 的並發使用檢測

1.7

首次發布:2016-08-15

最後更新:go1.7.6 (released 2017-05-23)

go1.7 版本的詳細更新日志可以前往Go 1.7 Release Notes查看,在其維護期間發布的所有補丁版本可以前往Go1.7 - Release Patch了解。

重要變化

  1. golang.org/x/net/context加入標准庫
  2. gc 時間相較於 1.6 大幅縮短
  3. testing包支持子測試

1.6

首次發布:2016-02-17

最後更新:go1.6.4 (released 2016-12-01)

go1.6 版本的詳細更新日志可以前往Go 1.6 Release Notes查看,在其維護期間發布的所有補丁版本可以前往Go1.6 - Release Patch了解。

重要變化

該版本沒有語法上的變更,下面是比較重要的變化

  1. 對 map 進行並發使用檢測,如果檢測到了 map 正在並發使用會拋出fatal
  2. 在發生panic時,只會打印正在運行協程的調用棧
  3. 支持 HTTP/2

1.5

首次發布:2015-08-19

最後更新:go1.5.4 (released 2016-04-12)

go1.5 版本的詳細更新日志可以前往Go 1.5 Release Notes查看,在其維護期間發布的所有補丁版本可以前往Go1.5 - Release Patch了解。

語言層面

  1. 在初始化 map 字面量的鍵時,允許省略元素類型

    go
    m := map[Point]string{
        Point{29.935523, 52.891566}:   "Persepolis",
        Point{-25.352594, 131.034361}: "Uluru",
        Point{37.422455, -122.084306}: "Googleplex",
    }
    
    // 省略類型
    m := map[Point]string{
        {29.935523, 52.891566}:   "Persepolis",
        {-25.352594, 131.034361}: "Uluru",
        {37.422455, -122.084306}: "Googleplex",
    }

其它

  1. 運行時和編譯器完全由 go 重寫,不再包含任何 c 代碼
  2. 支持並發垃圾收集,大大減少了程序暫停的時間
  3. GOMAXPROCS默認值變為機器的邏輯核數
  4. internal包的語義可以應用到任何地方,不再只局限於 go 的源碼包
  5. 實驗性的支持 vendor 依賴管理(終於開始著手處理依賴管理這部分了)

1.4

首次發布:2014-12-10

最後更新:go1.4.3 (released 2015-09-22)

go1.4 版本的詳細更新日志可以前往Go 1.4 Release Notes查看,在其維護期間發布的所有補丁版本可以前往Go1.4 - Release Patch了解。

語言層面

  1. for range循環可以一個迭代參數,比如

    for i := range x {
        ...
    }

    但是不能一個都沒有

  2. 在調用雙重引用類型的方法時,不再自動解引用

    go
    type T int
    func (T) M() {}
    var x **T
    
    // 不被允許
    x.M()

其它

  1. 在 1.4 之前,go 的運行時都是由 c 編寫的,現在全部由 go 完成
  2. 支持將包名修改為internal來表示該包的所有內容都是私有的不可導出

1.3

首次發布:2014-06-18

最後更新:go1.3.3 (released 2014-09-30)

go1.3 版本的詳細更新日志可以前往Go 1.3 Release Notes查看,在其維護期間發布的所有補丁版本可以前往Go1.3 - Release Patch了解。

重要變化

該版本沒有語法上的變更,一些比較重要的變化如下

  1. 協程棧模型從分段棧改為連續棧,提升了棧擴容的性能。
  2. 提升了垃圾回收器指針判斷的精度
  3. 在小容量 map 中進行迭代,順序也會變得不可預測
  4. 由於一些運行時方面的完善,當前版本的 go 程序性能有了較大幅度的提升

1.2

首次發布:2013-12-01

最後更新:go1.2.2 (released 2014-05-05)

go1.2 版本的詳細更新日志可以前往Go 1.2 Release Notes查看,在其維護期間發布的所有補丁版本可以前往Go1.2 - Release Patch了解。

語言層面

  1. 對值為nil的變量進行操作會引發panic

  2. 在對切片進行分隔時,可以使用第三個參數來限制被分割的切片容量從而更安全的使用切片

    go
    var array [10]int
    slice := array[2:4:4]

其它

  1. 協程棧的最小內存大小由 4KB 提升到了 8KB

  2. 將最大線程數限制在了 10000

  3. 長時間運行的協程在發生函數調用時會被搶佔(協作式搶佔的首次引入)

1.1

首次發布:2013-05-13

最後更新:go1.1.2 (released 2013-08-13)

go1.1 版本的詳細更新日志可以前往Go 1.1 Release Notes查看,在其維護期間發布的所有補丁版本可以前往Go1.1 - Release Patch了解。

語言層面

  1. 一個數被 0 整除以前會拋出panic,到了 1.1 直接無法通過編譯。
  2. 方法可以作為一個值存在。
  3. 引入了終止語句的概念,函數的返回規則更為寬松,終止語句的定義 - go-sepc

性能方面

  1. 使用 go1.1 的工具編譯的 go 程序性能大概可以提升 30%-40%

其它:

  1. 在 64 位機上堆內存的最大值提升到了幾十 GB
  2. 交叉編譯時默認禁用 cgo

1.0

首次發布:2012-03-28

go1.0 版本的詳細更新日志可以前往Go 1.0 Release Notes查看,在其維護期間發布的所有補丁版本可以前往Go1.0 - Release Patch了解。

語言層面

相較於預覽版而言,語法上多了以下這些東西

  1. 新增內置append函數,用於給切片添加元素

  2. 新增內置close函數,用於關閉管道

  3. 復合語義,在初始化切片,map,結構體字面量元素時,可以省略其類型,如下所示

    go
    // 聲明類型
    holiday1 := []Date{
        Date{"Feb", 14},
        Date{"Nov", 11},
        Date{"Dec", 25},
    }
    
    // 省略類型
    holiday2 := []Date{
        {"Feb", 14},
        {"Nov", 11},
        {"Dec", 25},
    }
  4. init函數中使用的協程會直接啟動,不需要再等待所有的包都初始化完畢。

  5. 新增rune類型,表示一個 UTF-8 字符

  6. 新增error內置接口,表示錯誤類型

  7. 新增delete內置函數用於刪除 map 中的鍵值對

  8. 使用for range迭代 map 的順序變得不可預測

  9. 支持同時給多個變量賦值

    a := 1
    b := 2
    a, b = 3, 4
  10. 變量隱藏問題:當函數的有具名返回值時,如果有任何返回值被隱藏了,則return語句必須攜帶返回值,否則編譯不通過,下面是一個錯誤示例

    go
    func Bug() (i, j, k int) {
        for i = 0; i < 5; i++ {
            for j := 0; j < 5; j++ { // Redeclares j.
                k += i * j
                if k > 100 {
                    return // Rejected: j is shadowed here.
                }
            }
        }
        return // OK: j is not shadowed here.
    }
  11. 允許復制帶有私有字段的結構體值

  12. 在結構體和切片都是可比較元素組成的情況下,允許它們作為 map 的鍵,同時移除了函數和 map 的可比較性

除了語言層面之外,go1.0 在包的組織方式和標准庫以及命令行方面相較於預覽版本都有著非常大的改變,由於內容太多這裡不再過多贅述,感興趣可以自己去官網了解。

pre

在 go1 正式發布之前,所有的版本都被稱為預覽版本,對於這些預覽版本官方會每周發布一個快照版本,其中比較重要的版本有

  • r60(2011-09-07),規定了 else 塊現在必須加括號
  • r59(2011-08-01),設計了新的結構體 tag 方案
  • r58(2011-06-29),修復了濫用 goto 而導致內存未初始化的問題,新增了 gui,exec 包
  • r57(2011-05-03),支持短變量多重賦值語法,重新設計了 http,reflect 包,將 gotest 作為一個 go 程序而非 shell 腳本
  • r56(2011-03-07),第一個穩定版本

預覽版本的開發始於 2009 年 12 月 09 日,在 go1 於 2012 年 3 月 28 日正式發布之後停止,持續了接近三年的時間,往後不再記錄每周快照版本。前往Pre-Go 1 Release History了解這些主要版本的信息,前往Weekly Snapshot History了解全部預覽版本的每周快照版本信息。

Golang學習網由www.golangdev.cn整理維護