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ữ
- Đã 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
- Thêm
test/synctest, dùng để kiểm tra mã đồng thời - 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/jsonbenchencoding/json/jsontext, cung cấp khả năng tương tác cấp thấp với chuỗi json
Công cụ
- 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
- go mod thêm chỉ thị
ignore, dùng để chỉ định các thư mục mà lệnh go nên bỏ qua go doc -httpcó thể khởi động một máy chủ http local, xem tài liệu mã- go vet, thêm bộ phân tích
waitgroupvàhostport - Khi dòng lệnh go cập nhật phiên bản go trong
go.modhoặcgo.work, không còn thêm phiên bản công cụ go được chỉ định
Runtime
GOMAXPROCS sẽ nhận biết giới hạn CPU của container trong môi trường container
GC thử nghiệm mới
greenteagc, đơn vị lập lịch cơ bản của GC từ object变成了memoery spanKhi panic không được bắt, không còn in lặp lại
panic: PANIC [recovered] panic: PANICthành
panic: PANIC [recovered, repanicked]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
Đã 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
gopackage 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) }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
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ữ
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ụ
goimport ( "other" ) type MyQuque[T any] = other.Queue[T]
Thư viện chuẩn
- 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ảinilkhông - 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 - Hỗ trợ mã hóa và băm: Thêm các gói
crypto/mlkem,crypto/hkdf,crypto/pbkdf2vàcrypto/sha3, tối ưu hiệu suất thuật toán mã hóa hiện có - Thêm hàm benchmark
testing.B.Loop, để kiểm tra vòng lặp tốt hơn encoding/json: Thêm tagomitzero, hỗ trợ lọc giá trị zero dựa trên phương thứcIsZero()stringsvàbytes: Thêm các hàm iterator (nhưLines,SplitSeq,FieldsSeq)
Runtime
- 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%
sync.Mapsử 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- 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
- 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
- Thêm
runtime.AddCleanupthay 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
- Hỗ trợ chú thích
#cgo noescapevà#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 - 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)vàvoid f(double)), tránh tạo chuỗi cuộc gọi sai
Công cụ
- 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
- Đầ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
- 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)
- 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
go buildtự độ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)- Biến môi trường
GOAUTHhỗ trợ xác thực mô-đun riêng tư. go.modhỗ trợ chỉ thịtoolquản lý phụ thuộc có thể thực thi, thay thế nhập空白tools.go- Thêm tham số
go get -toolvà lệnhgo install toolquản lý phụ thuộc công cụ mô-đun - Cache xây dựng hỗ trợ cache nhị phân cho
go runvàgo tool objdumphỗ trợ反汇编 LoongArch, RISC-V, S390Xvetthêm bộ phân tíchtests(phát hiện lỗi chữ ký hàm kiểm thử)
Tương thích nền tảng
- 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+
- 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
- Linux: Yêu cầu phiên bản kernel tối thiểu nâng lên 3.2
- Yêu cầu Go 1.22.6+ làm công cụ bootstrap
Loại bỏ
math/rand.Seed()hoàn toàn vô hiệu, cần khôi phục hành vi cũ thông quaGODEBUG=randseednop=0.runtime.GOROOT()đánh dấu là deprecated, khuyến nghị lấy đường dẫn thông quago 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ữ
for range hỗ trợ hàm iterator, thông tin chi tiết xem Go Wiki: Rangefunc Experiment.
gofunc 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
Thêm thư viện chuẩn
iter, nó định nghĩa và mô tả thông tin chi tiết về iteratorThư viện
mapsthêm một số hàm iteratorThư viện
slicesthêm một số hàm iteratorThê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ớgotype Person struct { Name string Age int _ structs.HostLayout }Tối ưu triển khai của thư viện chuẩn
time
Linker
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.nanotimev.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ụ
- Thêm lệnh
go telemetrydù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ữ
Đã giải quyết vấn đề biến vòng lặp của go
gofunc 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.
for rangegiờ hỗ trợ lặp kiểu số, như saugofor i := range 10 { fmt.Println(i) }
Thư viện chuẩn
Tăng cường routing của thư viện chuẩn
net/httpdatabase/sqlthêm kiểu genericsql.Nullgotype Null[T any] struct { V T Valid bool }Sử dụng như sau
gotype 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ữ
Thêm hai hàm built-in
min,max, dùng để tính giá trị lớn nhất nhỏ nhất.Thêm hàm built-in
clear, dùng để xóa map và sliceCậ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
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.
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) và Proposal: Less Error-Prone Loop Variable Scoping (googlesource.com)Đảm bảo giá trị trả về của
recoversẽ không phảinil, nếu tham số khi gọipaniclànil, thì sẽ kích hoạt mộtpanickhác, trả về*runtime.PanicNilError. Để tương thích, thiết lậpGODEBUG=panicnil=1khi biên dịch cho phép truyềnnilvàopanic.
Thư viện chuẩn
- Thêm thư viện
log/slog, cung cấp thư viện log có cấu trúc chuẩn - Thêm thư viện
testing/slogtest, dùng để xác minh triển khai củaslog.Handler - Thêm thư viện
slices, cung cấp một loạt các hàm generic dùng để thao tác slice. - Thêm thư viện
maps, cung cấp một loạt các hàm generic dùng để thao tác map - Thêm thư viện
cmp, dùng để so sánh các kiểu có thứ tự.
Khác
- 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ợ.
- 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ợ.
- 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.
- 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.pgotrong gói main, sau khi bật hiệu suất có thể tăng 2%-7%. - 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.
- 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.
- 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ữ
- 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). unsafethêm các hàmSliceData,String,StringData, dùng để xây dựng và struct slice và giá trị chuỗi.
Thư viện chuẩn
- 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). - go1.20 mở rộng hỗ trợ đóng gói error, cho phép một error đóng gói nhiều error.
- 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. httputil.ReverseProxy包含 một hàm Rewrite Hook mới, dùng để thay thế Director Hook trước đó.
Khác
- 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.
- 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.
- 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%.
- 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.
- 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.
- Hỗ trợ thu thập tệp coverage mã chương trình, xem Coverage profiling support for integration tests - The Go Programming Language
- Đã 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
Mô hình bộ nhớ hướng tới c/c++, tương tự TcMollcate
Gói
sync/atomicgiờ cung cấp nhiều kiểu hơn để sử dụngHỗ 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ớ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ữ
- 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
- Tối ưu hành vi mở rộng của hàm
append - Thêm gói
debug/buildinfo, có thể获取 thông tin xây dựng của chương trình go trong runtime - 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ữ
- Thêm hàm
unsafe.Add, hỗ trợ tính toán con trỏ - Thêm hàm
unsafe.Slice, hỗ trợ lấy con trỏ của mảng cơ sở của slice - 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
- Deprecated gói
ioutil - Hỗ trợ nhúng một số tệp tĩnh vào chương trình thông qua chỉ thị
//go:embed - 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
Tối ưu hiệu suất phân bổ đối tượng nhỏ
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ờ.goimprot _ "time/tzdata"Đã 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ã
Trong một số trường hợp, cho phép chuyển đổi
unsafe.Pointersanguinptr
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ữ
Hỗ trợ嵌套 kiểu interface phương thức tập hợp
gotype MyIO interface { io.WriteCloser }
Khác
- 引用 tối ưu hóa mã mở, chi phí gọi
defergiảm xuống gần như giống với gọi native - 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ữ
Hỗ trợ ký tự số hiện đại hơn, ví dụ
go0b101 // nhị phân 0o10 // thập phân 0x1B // thập lục phânHỗ trợ dấu gạch dưới phân cách số để mang lại khả năng đọc tốt hơn
go10_000Hậu tố số ảo
igiờ 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
- Giá trị mặc định của
GO111MODULElàauto - Thêm biến môi trường
GOPRIVATEđể hỗ trợ nguồn phụ thuộc riêng tư - Thêm biến môi trường
GOSUMDB - Chi phí sử dụng
defergiảm 30% - Khi xảy ra vượt quá chỉ số dưới,
panicgiờ sẽ xuất thông tin chỉ số - 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
- Nâng cao đáng kể hiệu suất quét heap
- Runtime sẽ tích cực hơn trong việc giải phóng bộ nhớ đã申请 cho hệ điều hành
- 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
- 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
- Hỗ trợ thử nghiệm WASM lần đầu
- 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
- Lệnh
go installgiờ 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 - Lệnh
go getgiờ dùng để tải xuống phụ thuộc mã nguồn - Kiểm thử go giờ sẽ cache kết quả kiểm thử, và sẽ tự động chạy
go vettrước khi chạy - 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ữ
- Hỗ trợ bí danh kiểu
Khác
- Hỗ trợ biên dịch song song
- Thêm
sync.Mapan 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ữ
Khi hai struct thực hiện chuyển đổi kiểu, sẽ bỏ qua sự khác biệt của tag struct
gofunc 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
- 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)
- Chi phí gọi
defergiảm gần một nửa - Chi phí go gọi c giảm gần một nửa
- 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
- Thêm
golang.org/x/net/contextvào thư viện chuẩn - Thời gian gc rút ngắn đáng kể so với 1.6
- Gói
testinghỗ 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
- 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 - Khi xảy ra
panic, chỉ in stack trace của goroutine đang chạy - 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ữ
Khi khởi tạo key của map literal, cho phép bỏ qua kiểu phần tử
gom := 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
- 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
- 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
- Giá trị mặc định của
GOMAXPROCS变为 số lõi logic của máy - Ngữ nghĩa của gói
internalcó 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 - 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ữ
Vòng lặp
for rangecó 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
Khi gọi phương thức của kiểu引用 kép, không còn tự động giải引用
gotype T int func (T) M() {} var x **T // Không được phép x.M()
Khác
- Trước 1.4, runtime của go được viết bằng c, giờ hoàn toàn bằng go
- 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
- 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.
- Nâng cao độ chính xác判断 con trỏ của bộ thu gom rác
- Khi lặp trong map dung lượng nhỏ, thứ tự cũng sẽ trở nên không thể dự đoán
- 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ữ
Thao tác trên biến có giá trị
nilsẽ gây rapanicKhi 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
govar array [10]int slice := array[2:4:4]
Khác
Kích thước bộ nhớ tối thiểu của stack goroutine từ 4KB tăng lên 8KB
Giới hạn số lượng thread tối đa ở 10000
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ữ
- 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. - Phương thức có thể tồn tại như một giá trị.
- 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
- 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:
- 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
- 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
Thêm hàm built-in
append, dùng để thêm phần tử vào sliceThêm hàm built-in
close, dùng để đóng pipeNgữ 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}, }Goroutine được sử dụng trong hàm
initsẽ đượ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.Thêm kiểu
rune, biểu thị một ký tự UTF-8Thêm interface built-in
error, biểu thị kiểu lỗiThêm hàm built-in
deletedùng để xóa cặp key-value trong mapThứ tự lặp của map khi sử dụng
for rangetrở nên không thể dự đoánHỗ trợ gán giá trị cho nhiều biến đồng thời
a := 1 b := 2 a, b = 3, 4Vấ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
returnphả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ỗigofunc 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. }Cho phép sao chép giá trị struct có trường riêng tư
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.
