Skip to content

Nhật Ký Cập Nhật Go

Phiên bản bảo trì:

  • go1.25, phát hành lần đầu: 2025-08-12, cập nhật cuối: go1.25.0 (2025-08-12)
  • go1.24, phát hành lần đầu: 2025-02-11, cập nhật cuối: go1.24.6 (2024-08-06)

Nhật ký cập nhật chính thức của Go: Release History - The Go Programming Language

Go chính thức sử dụng phiên bản ngữ nghĩa để nhận dạng phiên bản, định dạng là vphiên bản chính.phiên bản phụ.phiên bản vá (xem Semantic Versioning), cập nhật phiên bản chính có nghĩa là đã xảy ra Breaking Change, tức là các cập nhật không tương thích ngược, cập nhật phiên bản phụ có nghĩa là có tính năng mới được thêm vào đồng thời giữ tương thích ngược, cập nhật phiên bản vá có nghĩa là có vấn đề được sửa đồng thời giữ tương thích ngược.

Nhóm Go phát hành một phiên bản cấp hai mỗi nửa năm, và chỉ hai phiên bản cấp hai mới nhất được bảo trì dài hạn, thời gian bảo trì đều là sáu tháng,鉴于 Go mỗi lần cập nhật đều giữ tính tương thích khá cao, khuyến nghị nâng cấp Go lên phiên bản mới nhất kịp thời sau khi phiên bản mới ổn định.

Go2.0 lần trước được đề xuất dự thảo vào ngày 19 tháng 11 năm 2018, lúc đó vẫn là phiên bản go1.13, năm năm sau, phiên bản đã được lặp đến go1.21, các ý tưởng khác nhau của Go2.0 đã được thể hiện trên Go1.0 thông qua các cập nhật gia tăng, một trong những người sáng lập cũng từng明确表示 rằng trong tương lai có thể sẽ không có Go2.0, Go sẽ tiếp tục nỗ lực để giữ tương thích ngược (xem Go 1 and the Future of Go Programs).

Lưu ý

Trang này chỉ là bản sao đơn giản của nhật ký chính thức, cập nhật không định kỳ, muốn获取 thông tin mới nhất vui lòng đến trang web chính thức.

1.25

Phát hành lần đầu: 2025-08-12

Cập nhật cuối: go1.25.0 (2025-08-12)

Nhật ký cập nhật chi tiết của phiên bản go1.25 có thể xem tại Go 1.24 Release Notes, tất cả các phiên bản vá được phát hành trong thời gian bảo trì của nó có thể xem tại Go1.25 - Release Patch.

Mức độ ngôn ngữ

  1. Đã xóa khái niệm kiểu lõi (core type) trong generic, xem bài viết chính thức Goodbye core types

Thư viện chuẩn

  1. Thêm test/synctest, dùng để kiểm tra mã đồng thời
  2. Thêm thư viện thử nghiệm encoding/json/v2, bao gồm:
    • encoding/json/v2, tốc độ phản tuần tự hóa tăng khoảng 2-10 lần so với v1, benchmark xem go-json-experiment/jsonbench
    • encoding/json/jsontext, cung cấp khả năng tương tác cấp thấp với chuỗi json

Công cụ

  1. Các bản phát hành Go tiếp theo sẽ chứa một số công cụ nhị phân được xây dựng trước
  2. go mod thêm chỉ thị ignore, dùng để chỉ định các thư mục mà lệnh go nên bỏ qua
  3. go doc -http có thể khởi động một máy chủ http local, xem tài liệu mã
  4. go vet, thêm bộ phân tích waitgrouphostport
  5. Khi dòng lệnh go cập nhật phiên bản go trong go.mod hoặc go.work, không còn thêm phiên bản công cụ go được chỉ định

Runtime

  1. GOMAXPROCS sẽ nhận biết giới hạn CPU của container trong môi trường container

  2. GC thử nghiệm mới greenteagc, đơn vị lập lịch cơ bản của GC từ object变成了memoery span

  3. Khi panic không được bắt, không còn in lặp lại

    panic: PANIC [recovered]
      panic: PANIC

    thành

    panic: PANIC [recovered, repanicked]
  4. Thêm runtime/trace.FlightRecorder, có thể bắt thông tin thực thi runtime liên tục với cách nhẹ hơn

Trình biên dịch

  1. Đã sửa bug kiểm tra con trỏ null trễ của 1.21 (trễ đến sau khi kiểm tra lỗi), mã có vấn đề rõ ràng này, trước phiên bản 1.25 có thể chạy bình thường

    go
    package main
    
    import "os"
    
    func main() {
    	f, err := os.Open("nonExistentFile")
    	name := f.Name()
    	if err != nil {
    		println("should panic") // Trước 1.25 sẽ xuất dòng này
    		return
    	}
    	println(name)
    }
  2. Trình biên dịch sẽ dự trữ nhiều bộ nhớ backup hơn cho slice nằm trên stack, để nâng cao hiệu suất sử dụng

  3. Hỗ trợ tạo thông tin gỡ lỗi DWARF5

1.24

Phát hành lần đầu: 2025-02-11

Cập nhật cuối: go1.24.6 (2025-08-06)

Nhật ký cập nhật chi tiết của phiên bản go1.24 có thể xem tại Go 1.24 Release Notes, tất cả các phiên bản vá được phát hành trong thời gian bảo trì của nó có thể xem tại Go1.24 - Release Patch.

Mức độ ngôn ngữ

  1. Bí danh kiểu generic, cho phép tạo bí danh cho kiểu generic, điều này rất hữu ích khi引用 các kiểu generic do bên thứ ba định nghĩa, ví dụ

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

Thư viện chuẩn

  1. Thêm gói weak: Cung cấp con trỏ yếu (Weak Pointers), cho phép引用 đối tượng mà không tăng số lượng引用, tránh rò rỉ bộ nhớ do cache, trước khi sử dụng cần kiểm tra con trỏ có phải nil không
  2. Hạn chế truy cập hệ thống tệp: Giới thiệu kiểu os.Root, hạn chế thao tác tệp trong thư mục cụ thể, tăng cường bảo mật
  3. Hỗ trợ mã hóa và băm: Thêm các gói crypto/mlkem, crypto/hkdf, crypto/pbkdf2crypto/sha3, tối ưu hiệu suất thuật toán mã hóa hiện có
  4. Thêm hàm benchmark testing.B.Loop, để kiểm tra vòng lặp tốt hơn
  5. encoding/json: Thêm tag omitzero, hỗ trợ lọc giá trị zero dựa trên phương thức IsZero()
  6. stringsbytes: Thêm các hàm iterator (như Lines, SplitSeq, FieldsSeq)

Runtime

  1. Tái cấu trúc map built-in dựa trên Swiss Tables, tốc độ truy cập map lớn tăng 30%, tốc độ lặp tăng 10%-60%
  2. sync.Map sử dụng concurrent hash trie (hash-trie) để tối ưu hiệu suất, đặc biệt trong trường hợp đồng thời ghi
  3. Khóa mutex nội bộ của runtime sử dụng triển khai spinbit mới, giảm cạnh tranh khóa, nâng cao hiệu suất trong các tình huống đồng thời cao
  4. Tối ưu chiến lược phân bổ đối tượng nhỏ, giảm phân mảnh bộ nhớ và thời gian tạm dừng GC
  5. Thêm runtime.AddCleanup thay thế runtime.SetFinalizer, hỗ trợ đăng ký nhiều hàm dọn dẹp cho đối tượng, và thực thi tuần tự trong goroutine độc lập

Cgo

  1. Hỗ trợ chú thích #cgo noescape#cgo nocallback, lần lượt khai báo hàm C không thoát bộ nhớ và không gọi lại hàm Go, nâng cao hiệu suất runtime
  2. Cgo giờ sẽ từ chối biên dịch các cuộc gọi đến các hàm C có nhiều khai báo không tương thích, phát hiện nghiêm ngặt các khai báo hàm C không tương thích qua các tệp (như void f(int)void f(double)), tránh tạo chuỗi cuộc gọi sai

Công cụ

  1. Quản lý phụ thuộc công cụ mô-đun: Theo dõi phụ thuộc công cụ thông qua chỉ thị tool của go.mod, thay thế方案 nhập空白 tools.go truyền thống
  2. Đầu ra có cấu trúc: go build và go test hỗ trợ cờ -json, xuất kết quả xây dựng và kiểm thử định dạng JSON
  3. Tối ưu biên dịch và link: Trình biên dịch tạo mã hiệu quả hơn, linker mặc định tạo GNU Build ID (nền tảng ELF) và UUID (macOS)
  4. Cấm định nghĩa phương thức cho các kiểu được tạo bởi CGO thông qua bí danh
  5. go build tự động nhúng thông tin hệ thống kiểm soát phiên bản vào tệp nhị phân (hỗ trợ tắt bằng -buildvcs=false)
  6. Biến môi trường GOAUTH hỗ trợ xác thực mô-đun riêng tư.
  7. go.mod hỗ trợ chỉ thị tool quản lý phụ thuộc có thể thực thi, thay thế nhập空白 tools.go
  8. Thêm tham số go get -tool và lệnh go install tool quản lý phụ thuộc công cụ mô-đun
  9. Cache xây dựng hỗ trợ cache nhị phân cho go rungo tool
  10. objdump hỗ trợ反汇编 LoongArch, RISC-V, S390X
  11. vet thêm bộ phân tích tests (phát hiện lỗi chữ ký hàm kiểm thử)

Tương thích nền tảng

  1. macOS: Go 1.24 là phiên bản cuối cùng hỗ trợ macOS 11 Big Sur, Go 1.25 sẽ yêu cầu macOS 12+
  2. Windows: Đánh dấu kiến trúc ARM 32-bit là không hoàn thiện (GOOS=windows GOARCH=arm), xem issue #70705
  3. Linux: Yêu cầu phiên bản kernel tối thiểu nâng lên 3.2
  4. Yêu cầu Go 1.22.6+ làm công cụ bootstrap

Loại bỏ

  1. math/rand.Seed() hoàn toàn vô hiệu, cần khôi phục hành vi cũ thông qua GODEBUG=randseednop=0.
  2. runtime.GOROOT() đánh dấu là deprecated, khuyến nghị lấy đường dẫn thông qua go env GOROOT

1.23

Phát hành lần đầu: 2024-08-13

Cập nhật cuối: go1.23.4 (2024-12-03)

Nhật ký cập nhật chi tiết của phiên bản go1.23 có thể xem tại Go 1.23 Release Notes, tất cả các phiên bản vá được phát hành trong thời gian bảo trì của nó có thể xem tại Go1.23 - Release Patch.

Mức độ ngôn ngữ

  1. for range hỗ trợ hàm iterator, thông tin chi tiết xem 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

    Đây là một tính năng khá thiết thực, thường sẽ kết hợp với generic.

Thư viện chuẩn

  1. Thêm thư viện chuẩn iter, nó định nghĩa và mô tả thông tin chi tiết về iterator

  2. Thư viện maps thêm một số hàm iterator

  3. Thư viện slices thêm một số hàm iterator

  4. Thêm thư viện structs, cung cấp khả năng sửa đổi thuộc tính struct, ví dụ bố cục bộ nhớ

    go
    type Person struct {
      Name string
      Age  int
      _    structs.HostLayout
    }
  5. Tối ưu triển khai của thư viện chuẩn time

Linker

  1. Xử lý lạm dụng //go:linkname, tạm thời cho phép tồn tại một số API thường được引用, ví dụ runtime.memhash64, runtime.nanotime v.v., sau đó sẽ không cho phép các引用 mới khác.

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

    Mã như này sẽ không thể biên dịch

    link: main: invalid reference to runtime.gcinit

Công cụ

  1. Thêm lệnh go telemetry dùng để quản lý dữ liệu từ xa

1.22

Phát hành lần đầu: 2024-02-06

Cập nhật cuối: go1.22.6 (phát hành 2024-08-06)

Nhật ký cập nhật chi tiết của phiên bản go1.22 có thể xem tại Go 1.22 Release Notes, tất cả các phiên bản vá được phát hành trong thời gian bảo trì của nó có thể xem tại Go1.22 - Release Patch.

Mức độ ngôn ngữ

  1. Đã giải quyết vấn đề biến vòng lặp của 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()
    }

    Mã này trước 1.22, sẽ xuất 10 số 9, sau 1.22 thì sẽ xuất bình thường từ 0 đến 9.

  2. for range giờ hỗ trợ lặp kiểu số, như sau

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

Thư viện chuẩn

  1. Tăng cường routing của thư viện chuẩn net/http

  2. database/sql thêm kiểu generic sql.Null

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

    Sử dụng như sau

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

1.21

Phát hành lần đầu: 2023-08-08

Cập nhật cuối: go1.21.13 (phát hành 2024-08-06)

Nhật ký cập nhật chi tiết của phiên bản go1.21 có thể xem tại Go 1.21 Release Notes, tất cả các phiên bản vá được phát hành trong thời gian bảo trì của nó có thể xem tại Go1.21 - Release Patch.

Mức độ ngôn ngữ

  1. Thêm hai hàm built-in min, max, dùng để tính giá trị lớn nhất nhỏ nhất.

  2. Thêm hàm built-in clear, dùng để xóa map và slice

  3. Cập nhật thứ tự khởi tạo package

    • Sắp xếp tất cả các gói theo đường dẫn import
    • Lặp lại cho đến khi danh sách gói rỗng
    • Tìm gói đầu tiên trong danh sách mà tất cả các import đã được khởi tạo
    • Khởi tạo gói đó và xóa nó khỏi danh sách
  4. Nâng cao và cải thiện khả năng và độ chính xác của suy luận kiểu, chủ yếu liên quan đến generic.

  5. Ra mắt phiên bản xem trước của cải thiện biến vòng lặp for range, đây là một vấn đề đã làm phiền các nhà phát triển Go gần mười năm,官方 cuối cùng cũng giải quyết, chi tiết xem: LoopvarExperiment · golang/go Wiki (github.com)Proposal: Less Error-Prone Loop Variable Scoping (googlesource.com)

  6. Đảm bảo giá trị trả về của recover sẽ không phải nil, nếu tham số khi gọi panicnil, thì sẽ kích hoạt một panic khác, trả về *runtime.PanicNilError. Để tương thích, thiết lập GODEBUG=panicnil=1 khi biên dịch cho phép truyền nil vào panic.

Thư viện chuẩn

  1. Thêm thư viện log/slog, cung cấp thư viện log có cấu trúc chuẩn
  2. Thêm thư viện testing/slogtest, dùng để xác minh triển khai của slog.Handler
  3. Thêm thư viện slices, cung cấp một loạt các hàm generic dùng để thao tác slice.
  4. Thêm thư viện maps, cung cấp một loạt các hàm generic dùng để thao tác map
  5. Thêm thư viện cmp, dùng để so sánh các kiểu có thứ tự.

Khác

  1. go1.21.0 ít nhất trên hệ thống windows cần win10 hoặc Windows Server 2016 trở lên mới có thể chạy, các phiên bản trước không còn được hỗ trợ.
  2. go1.21.0 ít nhất cần chạy trên macOS 10.15 Catalina hoặc phiên bản mới hơn, các phiên bản trước không còn được hỗ trợ.
  3. Thêm WebAssembly System Interface thử nghiệm, Go vẫn đang không ngừng khám phá trong lĩnh vực WASM.
  4. PGO (Profile-guided optimization) vẫn là thử nghiệm trong phiên bản 1.20 (xem Profile-guided optimization - The Go Programming Language), phiên bản 1.21 chính thức bật. Sẽ bật chức năng này khi chứa tệp default.pgo trong gói main, sau khi bật hiệu suất có thể tăng 2%-7%.
  5. Khi in stack trace runtime rất sâu, từ trước chỉ in một trăm frame đầu tiên, đến giờ lần lượt in 50 frame đầu và 50 frame cuối.
  6. Tối ưu hiệu suất gọi CGO trên nền tảng Unix, từ 1-3 micro giây tối ưu xuống 100-200 nano giây hiện tại.
  7. Trong phiên bản 1.21, tốc độ biên dịch tăng gần 6%, điều này chủ yếu nhờ vào việc chính trình biên dịch sử dụng PGO để xây dựng.

1.20

Phát hành lần đầu: 2023-02-01

Cập nhật cuối: go1.20.14 (phát hành 2024-02-06)

Nhật ký cập nhật chi tiết của phiên bản go1.20 có thể xem tại Go 1.20 Release Notes, tất cả các phiên bản vá được phát hành trong thời gian bảo trì của nó có thể xem tại Go1.20 - Release Patch.

Mức độ ngôn ngữ

  1. Khi chuyển đổi kiểu slice sang array, trước đây cần giải引用 con trỏ array *(*[4byte])(x) để tránh cùng một mảng cơ sở với thao tác slice, giờ có thể viết trực tiếp [4]byte(x).
  2. unsafe thêm các hàm SliceData, String, StringData, dùng để xây dựng và struct slice và giá trị chuỗi.

Thư viện chuẩn

  1. Thêm thư viện crypto/ecdh, cung cấp hỗ trợ cho ECDH (Elliptic Curve Diffie-Hellman, một phương pháp mã hóa bất đối xứng).
  2. go1.20 mở rộng hỗ trợ đóng gói error, cho phép một error đóng gói nhiều error.
  3. Thêm net/http.ResponseContorller, cung cấp một cách rõ ràng và dễ khám phá hơn để thêm các điều khiển handler mỗi.
  4. httputil.ReverseProxy包含 một hàm Rewrite Hook mới, dùng để thay thế Director Hook trước đó.

Khác

  1. go1.20 là phiên bản cuối cùng hỗ trợ win7, 8, Server2008 và Server2012, sẽ không còn hỗ trợ trong các phiên bản tương lai.
  2. go1.20 là phiên bản cuối cùng hỗ trợ macOS 10.13 hoặc 10.14, sẽ không còn hỗ trợ trong các phiên bản tương lai.
  3. Trong các phiên bản 1.18 và 1.19, do sự xuất hiện của generic, so với 1.17 tốc độ biên dịch xuất hiện lùi, go1.20 tốc độ biên dịch sẽ tăng khoảng 10%.
  4. Phát hành phiên bản xem trước của PGO (Profile-guided optimization), đây là một công nghệ tối ưu hóa trình biên dịch trong giới máy tính, có thể nâng cao hiệu suất runtime.
  5. Trong go1.20, trên các hệ thống không có công cụ C, lệnh go vô hiệu hóa cgo.
  6. Hỗ trợ thu thập tệp coverage mã chương trình, xem Coverage profiling support for integration tests - The Go Programming Language
  7. Đã cải tiến GC, nâng cao tính ổn định, giảm chi tiêu bộ nhớ, nâng cao hiệu suất CPU tổng thể 2%.

1.19

Phát hành lần đầu: 2022-08-02

Cập nhật cuối: go1.19.13 (phát hành 2023-09-06)

Nhật ký cập nhật chi tiết của phiên bản go1.19 có thể xem tại Go 1.19 Release Notes, tất cả các phiên bản vá được phát hành trong thời gian bảo trì của nó có thể xem tại Go1.19 - Release Patch.

Thay đổi quan trọng

  1. Mô hình bộ nhớ hướng tới c/c++, tương tự TcMollcate

  2. Gói sync/atomic giờ cung cấp nhiều kiểu hơn để sử dụng

  3. Hỗ trợ sử dụng hàm runtime/debug.SetMemoryLimit để giới hạn mềm bộ nhớ go, trong một số trường hợp có thể cung cấp hiệu quả sử dụng bộ nhớ

  4. Runtime giờ sẽ chọn một kích thước phù hợp để khởi tạo bộ nhớ stack space cho goroutine dựa trên mức sử dụng trung bình của stack goroutine, điều này có thể tránh việc mở rộng và thu hẹp stack thường xuyên

1.18

Phát hành lần đầu: 2022-03-15

Cập nhật cuối: go1.18.10 (phát hành 2023-01-10)

Nhật ký cập nhật chi tiết của phiên bản go1.18 có thể xem tại Go 1.18 Release Notes, tất cả các phiên bản vá được phát hành trong thời gian bảo trì của nó có thể xem tại Go1.18 - Release Patch.

Mức độ ngôn ngữ

  1. Cập nhật quan trọng, hỗ trợ generic, interface kiểu tập hợp, ràng buộc kiểu tham số

Khác

  1. Tối ưu hành vi mở rộng của hàm append
  2. Thêm gói debug/buildinfo, có thể获取 thông tin xây dựng của chương trình go trong runtime
  3. gofmt giờ có thể định dạng các tệp nguồn đồng thời

1.17

Phát hành lần đầu: 2021-08-16

Cập nhật cuối: go1.17.13 (phát hành 2022-08-01)

Nhật ký cập nhật chi tiết của phiên bản go1.17 có thể xem tại Go 1.17 Release Notes, tất cả các phiên bản vá được phát hành trong thời gian bảo trì của nó có thể xem tại Go1.17 - Release Patch.

Mức độ ngôn ngữ

  1. Thêm hàm unsafe.Add, hỗ trợ tính toán con trỏ
  2. Thêm hàm unsafe.Slice, hỗ trợ lấy con trỏ của mảng cơ sở của slice
  3. Slice giờ có thể chuyển đổi thành kiểu con trỏ array, []T => *[N]T, với điều kiện độ dài của array phải nhỏ hơn hoặc bằng độ dài của slice

1.16

Phát hành lần đầu: 2021-02-16

Cập nhật cuối: go1.16.15 (phát hành 2022-03-03)

Nhật ký cập nhật chi tiết của phiên bản go1.16 có thể xem tại Go 1.16 Release Notes, tất cả các phiên bản vá được phát hành trong thời gian bảo trì của nó có thể xem tại Go1.16 - Release Patch.

Thay đổi quan trọng

Phiên bản này không có thay đổi quan trọng về cú pháp, một số thay đổi quan trọng như sau

  1. Deprecated gói ioutil
  2. Hỗ trợ nhúng một số tệp tĩnh vào chương trình thông qua chỉ thị //go:embed
  3. Thêm kiểu io/fs.Fs,抽象 hóa tốt hơn cho hệ thống tệp

1.15

Phát hành lần đầu: 2020-08-11

Cập nhật cuối: go1.15.15 (phát hành 2021-08-05)

Nhật ký cập nhật chi tiết của phiên bản go1.15 có thể xem tại Go 1.15 Release Notes, tất cả các phiên bản vá được phát hành trong thời gian bảo trì của nó có thể xem tại Go1.15 - Release Patch.

Thay đổi quan trọng

Phiên bản này không có thay đổi quan trọng về cú pháp, một số thay đổi quan trọng như sau

  1. Tối ưu hiệu suất phân bổ đối tượng nhỏ

  2. Thêm gói time/tzdata, hỗ trợ nhúng cơ sở dữ liệu múi giờ vào chương trình thông qua cách sau, vì có nhiều hệ thống local không có thông tin dữ liệu múi giờ.

    go
    improt _ "time/tzdata"
  3. Đã thực hiện cải tiến lớn cho linker go, giảm sử dụng tài nguyên của nó, và nâng cao tính ổn định của mã

  4. Trong một số trường hợp, cho phép chuyển đổi unsafe.Pointer sang uinptr

1.14

Phát hành lần đầu: 2020-02-25

Cập nhật cuối: go1.14.15 (phát hành 2021-02-04)

Nhật ký cập nhật chi tiết của phiên bản go1.14 có thể xem tại Go 1.14 Release Notes, tất cả các phiên bản vá được phát hành trong thời gian bảo trì của nó có thể xem tại Go1.14 - Release Patch.

Mức độ ngôn ngữ

  1. Hỗ trợ嵌套 kiểu interface phương thức tập hợp

    go
    type MyIO interface {
      io.WriteCloser
    }

Khác

  1. 引用 tối ưu hóa mã mở, chi phí gọi defer giảm xuống gần như giống với gọi native
  2. Hỗ trợ chiếm quyền đồng thời giữa các goroutine, các vòng lặp không có gọi hàm sẽ không còn chặn lập lịch vĩnh viễn

1.13

Phát hành lần đầu: 2019-09-03

Cập nhật cuối: go1.13.15 (phát hành 2020-08-06)

Nhật ký cập nhật chi tiết của phiên bản go1.13 có thể xem tại Go 1.13 Release Notes, tất cả các phiên bản vá được phát hành trong thời gian bảo trì của nó có thể xem tại Go1.13 - Release Patch.

Mức độ ngôn ngữ

  1. Hỗ trợ ký tự số hiện đại hơn, ví dụ

    go
    0b101 // nhị phân
    0o10 // thập phân
    0x1B // thập lục phân

    Hỗ trợ dấu gạch dưới phân cách số để mang lại khả năng đọc tốt hơn

    go
    10_000

    Hậu tố số ảo i giờ có thể là bất kỳ số nhị phân, thập phân, thập lục phân, hoặc số dấu phẩy động nào

Khác

  1. Giá trị mặc định của GO111MODULEauto
  2. Thêm biến môi trường GOPRIVATE để hỗ trợ nguồn phụ thuộc riêng tư
  3. Thêm biến môi trường GOSUMDB
  4. Chi phí sử dụng defer giảm 30%
  5. Khi xảy ra vượt quá chỉ số dưới, panic giờ sẽ xuất thông tin chỉ số
  6. go sẽ xác minh phiên bản ngữ nghĩa khi tải xuống phụ thuộc

1.12

Phát hành lần đầu: 2019-02-25

Cập nhật cuối: go1.12.17 (phát hành 2020-02-12)

Nhật ký cập nhật chi tiết của phiên bản go1.12 có thể xem tại Go 1.12 Release Notes, tất cả các phiên bản vá được phát hành trong thời gian bảo trì của nó có thể xem tại Go1.12 - Release Patch.

Thay đổi quan trọng

Phiên bản này không có thay đổi quan trọng về cú pháp, một số thay đổi quan trọng như sau

  1. Nâng cao đáng kể hiệu suất quét heap
  2. Runtime sẽ tích cực hơn trong việc giải phóng bộ nhớ đã申请 cho hệ điều hành
  3. Lệnh dùng để tải xuống phụ thuộc go giờ có thể sử dụng an toàn đồng thời

1.11

Phát hành lần đầu: 2018-08-24

Cập nhật cuối: go1.11.13 (phát hành 2019-08-13)

Nhật ký cập nhật chi tiết của phiên bản go1.11 có thể xem tại Go 1.11 Release Notes, tất cả các phiên bản vá được phát hành trong thời gian bảo trì của nó có thể xem tại Go1.11 - Release Patch.

Thay đổi quan trọng

Phiên bản này không có thay đổi quan trọng về cú pháp, một số thay đổi quan trọng như sau

  1. GoMod phát hành lần đầu, tình trạng hỗn loạn quản lý phụ thuộc trước đó sắp kết thúc
  2. Hỗ trợ thử nghiệm WASM lần đầu
  3. Runtime sử dụng bố cục heap thưa, không còn giới hạn kích thước heap

1.10

Phát hành lần đầu: 2018-02-16

Cập nhật cuối: go1.10.8 (phát hành 2019-01-23)

Nhật ký cập nhật chi tiết của phiên bản go1.10 có thể xem tại Go 1.10 Release Notes, tất cả các phiên bản vá được phát hành trong thời gian bảo trì của nó có thể xem tại Go1.10 - Release Patch.

Thay đổi quan trọng

Phiên bản này không có thay đổi quan trọng về cú pháp, một số thay đổi quan trọng như sau

  1. Lệnh go install giờ chỉ dùng để cài đặt và biên dịch các công cụ dòng lệnh, không còn dùng để tải xuống phụ thuộc
  2. Lệnh go get giờ dùng để tải xuống phụ thuộc mã nguồn
  3. Kiểm thử go giờ sẽ cache kết quả kiểm thử, và sẽ tự động chạy go vet trước khi chạy
  4. Giảm đáng kể độ trễ do GC gây ra khi hoạt động

1.9

Phát hành lần đầu: 2017-08-24

Cập nhật cuối: go1.9.7 (phát hành 2018-06-05)

Nhật ký cập nhật chi tiết của phiên bản go1.9 có thể xem tại Go 1.9 Release Notes, tất cả các phiên bản vá được phát hành trong thời gian bảo trì của nó có thể xem tại Go1.9 - Release Patch.

Mức độ ngôn ngữ

  1. Hỗ trợ bí danh kiểu

Khác

  1. Hỗ trợ biên dịch song song
  2. Thêm sync.Map an toàn cho đồng thời

1.8

Phát hành lần đầu: 2017-02-16

Cập nhật cuối: go1.8.7 (phát hành 2018-02-07)

Nhật ký cập nhật chi tiết của phiên bản go1.8 có thể xem tại Go 1.8 Release Notes, tất cả các phiên bản vá được phát hành trong thời gian bảo trì của nó có thể xem tại Go1.8 - Release Patch.

Mức độ ngôn ngữ

  1. Khi hai struct thực hiện chuyển đổi kiểu, sẽ bỏ qua sự khác biệt của tag struct

    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) // giờ hợp lệ
    }

Khác

  1. Thời gian tạm dừng do thu gom rác gây ra thấp đến 10 micro giây, trong hầu hết các trường hợp dưới 100 micro giây (có thể thấy gần như mỗi phiên bản go đều nỗ lực cải tiến GC)
  2. Chi phí gọi defer giảm gần một nửa
  3. Chi phí go gọi c giảm gần một nửa
  4. Tối ưu phát hiện sử dụng đồng thời của map

1.7

Phát hành lần đầu: 2016-08-15

Cập nhật cuối: go1.7.6 (phát hành 2017-05-23)

Nhật ký cập nhật chi tiết của phiên bản go1.7 có thể xem tại Go 1.7 Release Notes, tất cả các phiên bản vá được phát hành trong thời gian bảo trì của nó có thể xem tại Go1.7 - Release Patch.

Thay đổi quan trọng

  1. Thêm golang.org/x/net/context vào thư viện chuẩn
  2. Thời gian gc rút ngắn đáng kể so với 1.6
  3. Gói testing hỗ trợ kiểm thử con

1.6

Phát hành lần đầu: 2016-02-17

Cập nhật cuối: go1.6.4 (phát hành 2016-12-01)

Nhật ký cập nhật chi tiết của phiên bản go1.6 có thể xem tại Go 1.6 Release Notes, tất cả các phiên bản vá được phát hành trong thời gian bảo trì của nó có thể xem tại Go1.6 - Release Patch.

Thay đổi quan trọng

Phiên bản này không có thay đổi cú pháp, dưới đây là những thay đổi quan trọng

  1. Phát hiện sử dụng đồng thời cho map, nếu phát hiện map đang được sử dụng đồng thời sẽ ném ra fatal
  2. Khi xảy ra panic, chỉ in stack trace của goroutine đang chạy
  3. Hỗ trợ HTTP/2

1.5

Phát hành lần đầu: 2015-08-19

Cập nhật cuối: go1.5.4 (phát hành 2016-04-12)

Nhật ký cập nhật chi tiết của phiên bản go1.5 có thể xem tại Go 1.5 Release Notes, tất cả các phiên bản vá được phát hành trong thời gian bảo trì của nó có thể xem tại Go1.5 - Release Patch.

Mức độ ngôn ngữ

  1. Khi khởi tạo key của map literal, cho phép bỏ qua kiểu phần tử

    go
    m := map[Point]string{
        Point{29.935523, 52.891566}:   "Persepolis",
        Point{-25.352594, 131.034361}: "Uluru",
        Point{37.422455, -122.084306}: "Googleplex",
    }
    
    // Bỏ qua kiểu
    m := map[Point]string{
        {29.935523, 52.891566}:   "Persepolis",
        {-25.352594, 131.034361}: "Uluru",
        {37.422455, -122.084306}: "Googleplex",
    }

Khác

  1. Runtime và trình biên dịch hoàn toàn được viết lại bằng go, không còn chứa bất kỳ mã c nào
  2. Hỗ trợ thu gom rác đồng thời, giảm đáng kể thời gian tạm dừng của chương trình
  3. Giá trị mặc định của GOMAXPROCS变为 số lõi logic của máy
  4. Ngữ nghĩa của gói internal có thể áp dụng cho bất kỳ đâu, không còn chỉ giới hạn trong các gói nguồn của go
  5. Hỗ trợ thử nghiệm quản lý phụ thuộc vendor (cuối cùng cũng bắt đầu xử lý phần quản lý phụ thuộc này)

1.4

Phát hành lần đầu: 2014-12-10

Cập nhật cuối: go1.4.3 (phát hành 2015-09-22)

Nhật ký cập nhật chi tiết của phiên bản go1.4 có thể xem tại Go 1.4 Release Notes, tất cả các phiên bản vá được phát hành trong thời gian bảo trì của nó có thể xem tại Go1.4 - Release Patch.

Mức độ ngôn ngữ

  1. Vòng lặp for range có thể có một tham số lặp, ví dụ

    for i := range x {
        ...
    }

    Nhưng không thể không có cái nào

  2. Khi gọi phương thức của kiểu引用 kép, không còn tự động giải引用

    go
    type T int
    func (T) M() {}
    var x **T
    
    // Không được phép
    x.M()

Khác

  1. Trước 1.4, runtime của go được viết bằng c, giờ hoàn toàn bằng go
  2. Hỗ trợ đổi tên gói thành internal để biểu thị tất cả nội dung của gói đó đều là riêng tư không thể export

1.3

Phát hành lần đầu: 2014-06-18

Cập nhật cuối: go1.3.3 (phát hành 2014-09-30)

Nhật ký cập nhật chi tiết của phiên bản go1.3 có thể xem tại Go 1.3 Release Notes, tất cả các phiên bản vá được phát hành trong thời gian bảo trì của nó có thể xem tại Go1.3 - Release Patch.

Thay đổi quan trọng

Phiên bản này không có thay đổi cú pháp, một số thay đổi quan trọng như sau

  1. Mô hình stack goroutine từ stack phân đoạn改为 stack liên tục, nâng cao hiệu suất mở rộng stack.
  2. Nâng cao độ chính xác判断 con trỏ của bộ thu gom rác
  3. Khi lặp trong map dung lượng nhỏ, thứ tự cũng sẽ trở nên không thể dự đoán
  4. Do một số cải tiến về mặt runtime, hiệu suất của chương trình go phiên bản hiện tại đã được nâng cao đáng kể

1.2

Phát hành lần đầu: 2013-12-01

Cập nhật cuối: go1.2.2 (phát hành 2014-05-05)

Nhật ký cập nhật chi tiết của phiên bản go1.2 có thể xem tại Go 1.2 Release Notes, tất cả các phiên bản vá được phát hành trong thời gian bảo trì của nó có thể xem tại Go1.2 - Release Patch.

Mức độ ngôn ngữ

  1. Thao tác trên biến có giá trị nil sẽ gây ra panic

  2. Khi phân cách slice, có thể sử dụng tham số thứ ba để giới hạn dung lượng của slice được phân tách để sử dụng slice an toàn hơn

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

Khác

  1. Kích thước bộ nhớ tối thiểu của stack goroutine từ 4KB tăng lên 8KB

  2. Giới hạn số lượng thread tối đa ở 10000

  3. Goroutine chạy trong thời gian dài sẽ bị chiếm quyền khi xảy ra gọi hàm (lần đầu giới thiệu chiếm quyền hợp tác)

1.1

Phát hành lần đầu: 2013-05-13

Cập nhật cuối: go1.1.2 (phát hành 2013-08-13)

Nhật ký cập nhật chi tiết của phiên bản go1.1 có thể xem tại Go 1.1 Release Notes, tất cả các phiên bản vá được phát hành trong thời gian bảo trì của nó có thể xem tại Go1.1 - Release Patch.

Mức độ ngôn ngữ

  1. Một số bị chia cho 0 trước đây sẽ ném ra panic, đến 1.1 trực tiếp không thể biên dịch.
  2. Phương thức có thể tồn tại như một giá trị.
  3. Giới thiệu khái niệm câu lệnh kết thúc, quy tắc trả về của hàm rộng rãi hơn, định nghĩa câu lệnh kết thúc - go-sepc.

Hiệu suất

  1. Sử dụng công cụ go1.1 để biên dịch, hiệu suất của chương trình go có thể tăng khoảng 30%-40%

Khác:

  1. Trên máy 64-bit, giá trị tối đa của bộ nhớ heap tăng lên vài chục GB
  2. Khi biên dịch chéo mặc định vô hiệu hóa cgo

1.0

Phát hành lần đầu: 2012-03-28

Nhật ký cập nhật chi tiết của phiên bản go1.0 có thể xem tại Go 1.0 Release Notes, tất cả các phiên bản vá được phát hành trong thời gian bảo trì của nó có thể xem tại Go1.0 - Release Patch.

Mức độ ngôn ngữ

So với phiên bản xem trước, cú pháp có thêm những thứ sau

  1. Thêm hàm built-in append, dùng để thêm phần tử vào slice

  2. Thêm hàm built-in close, dùng để đóng pipe

  3. Ngữ nghĩa composite, khi khởi tạo phần tử của slice, map, struct literal, có thể bỏ qua kiểu của chúng, như sau

    go
    // Khai báo kiểu
    holiday1 := []Date{
        Date{"Feb", 14},
        Date{"Nov", 11},
        Date{"Dec", 25},
    }
    
    // Bỏ qua kiểu
    holiday2 := []Date{
        {"Feb", 14},
        {"Nov", 11},
        {"Dec", 25},
    }
  4. Goroutine được sử dụng trong hàm init sẽ được khởi động trực tiếp, không cần đợi tất cả các gói khởi tạo xong.

  5. Thêm kiểu rune, biểu thị một ký tự UTF-8

  6. Thêm interface built-in error, biểu thị kiểu lỗi

  7. Thêm hàm built-in delete dùng để xóa cặp key-value trong map

  8. Thứ tự lặp của map khi sử dụng for range trở nên không thể dự đoán

  9. Hỗ trợ gán giá trị cho nhiều biến đồng thời

    a := 1
    b := 2
    a, b = 3, 4
  10. Vấn đề ẩn biến: Khi hàm có giá trị trả về có tên, nếu có bất kỳ giá trị trả về nào bị ẩn, thì câu lệnh return phải mang theo giá trị trả về, nếu không sẽ không biên dịch được, dưới đây là một ví dụ lỗi

    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 // Bị từ chối: j bị shadow ở đây.
                }
            }
        }
        return // OK: j không bị shadow ở đây.
    }
  11. Cho phép sao chép giá trị struct có trường riêng tư

  12. Khi struct và slice đều là các phần tử có thể so sánh, cho phép chúng làm key của map, đồng thời xóa tính có thể so sánh của hàm và map

Ngoài mức độ ngôn ngữ, go1.0 có thay đổi rất lớn so với phiên bản xem trước về cách tổ chức gói và thư viện chuẩn cũng như dòng lệnh, do nội dung quá nhiều nên sẽ không trình bày quá nhiều ở đây, nếu quan tâm có thể tự đến trang web chính thức để tìm hiểu.

pre

Trước khi go1 chính thức phát hành, tất cả các phiên bản đều được gọi là phiên bản xem trước, đối với các phiên bản xem trước này官方 sẽ phát hành một phiên bản snapshot mỗi tuần, trong đó các phiên bản quan trọng có

  • r60(2011-09-07), quy định khối else giờ phải thêm dấu ngoặc
  • r59(2011-08-01), thiết kế方案 tag struct mới
  • r58(2011-06-29), đã sửa vấn đề lạm dụng goto dẫn đến bộ nhớ chưa khởi tạo, thêm gói gui, exec
  • r57(2011-05-03), hỗ trợ cú pháp gán nhiều biến ngắn, thiết kế lại gói http, reflect, biến gotest thành một chương trình go thay vì script shell
  • r56(2011-03-07), phiên bản ổn định đầu tiên

Phát triển phiên bản xem trước bắt đầu từ ngày 09 tháng 12 năm 2009, sau khi go1 chính thức phát hành vào ngày 28 tháng 3 năm 2012 thì dừng, kéo dài gần ba năm, sau đó không còn ghi lại phiên bản snapshot hàng tuần. Xem Pre-Go 1 Release History để biết thông tin về các phiên bản chính này, xem Weekly Snapshot History để biết thông tin về tất cả các phiên bản snapshot hàng tuần của các phiên bản xem trước.

Golang by www.golangdev.cn edit