- Phiên bản Go 1.22 được phát hành sau 6 tháng kể từ Go 1.21.
- Hầu hết các thay đổi nằm ở phần triển khai của toolchain, runtime và thư viện.
- Vẫn giữ cam kết tương thích Go 1, và gần như mọi chương trình Go đều được kỳ vọng sẽ biên dịch và chạy như trước.
Thay đổi ngôn ngữ
- Có hai thay đổi đối với vòng lặp "for".
- Trước đây, các biến được khai báo bởi vòng lặp "for" được tạo một lần và được cập nhật qua mỗi lần lặp, nhưng trong Go 1.22, mỗi lần lặp của vòng lặp sẽ tạo ra biến mới để ngăn lỗi chia sẻ ngoài ý muốn.
- Vòng lặp "for" giờ đây có thể range trên số nguyên.
Công cụ
Lệnh Go
- Có thể quản lý phụ thuộc bằng thư mục
vendor trong workspace.
go get không còn được hỗ trợ trong chế độ GOPATH cũ, không dùng module.
go mod init giờ đây không còn cố gắng nhập các yêu cầu module từ tệp cấu hình của các công cụ vendoring khác.
go test -cover giờ đây xuất bản tóm tắt coverage cho các package không có tệp kiểm thử riêng.
Trace
- Web UI của công cụ
trace đã được thiết kế lại một phần để hỗ trợ tracer mới.
Vet
- Hành vi của công cụ
vet đối với biến vòng lặp đã thay đổi.
- Đã thêm cảnh báo mới cho các lời gọi
append không thêm giá trị nào.
- Đã thêm cảnh báo mới cho vấn đề phát sinh khi dùng
time.Since trong câu lệnh defer.
- Đã thêm cảnh báo mới khi các cặp key-value không khớp trong lời gọi
log/slog.
Runtime
- Cải thiện hiệu năng CPU 1-3% bằng cách giữ metadata garbage collection dựa trên kiểu gần hơn với các đối tượng heap.
Compiler
- Các bản build tối ưu hóa theo hồ sơ (PGO) giờ đây có thể devirtualize nhiều lời gọi hơn trước.
Linker
- Các cờ
-s và -w của linker đã được thay đổi để hoạt động nhất quán hơn trên mọi nền tảng.
Bootstrap
- Go 1.22 yêu cầu bản phát hành point release cuối cùng của Go 1.20 trở lên để bootstrap.
Thư viện lõi
Gói math/rand/v2 mới
math/rand/v2 là gói “v2” đầu tiên của thư viện chuẩn, với nhiều thay đổi quan trọng so với math/rand.
Gói go/version mới
- Đã thêm gói
go/version mới, triển khai các hàm để kiểm tra tính hợp lệ và so sánh chuỗi phiên bản Go.
Mẫu định tuyến được cải tiến
- Khả năng định tuyến HTTP trong thư viện chuẩn đã được cải thiện để biểu đạt linh hoạt hơn.
Những thay đổi nhỏ trong thư viện
- Có nhiều thay đổi nhỏ và cải thiện hiệu năng trên các thư viện khác nhau.
Port
Darwin
- Trên macOS, với kiến trúc x86 64-bit (
darwin/amd64 port), toolchain Go giờ đây mặc định tạo ra tệp thực thi độc lập vị trí (PIE).
Arm
- Có thể dùng biến môi trường
GOARM để chọn floating point bằng phần mềm hoặc phần cứng.
Loong64
loong64 port giờ đây truyền tham số hàm và kết quả bằng thanh ghi.
OpenBSD
- Đã bổ sung port thử nghiệm cho big-endian PowerPC 64-bit (
openbsd/ppc64) trên OpenBSD.
Ý kiến của GN⁺
- Bản phát hành Go 1.22 lần này đặc biệt đáng chú ý với các thay đổi trong vòng lặp "for" và việc giới thiệu gói
math/rand/v2 mới. Những thay đổi này mang lại hiệu năng và độ ổn định tốt hơn cho các nhà phát triển Go, đồng thời các tính năng mới phản ánh sự phát triển của ngôn ngữ Go.
- Gói
math/rand/v2 cung cấp khả năng sinh số ngẫu nhiên tốt hơn thông qua các thuật toán nhanh hơn và API mới, đây là cải tiến quan trọng cho mã hóa và các ứng dụng khác phụ thuộc vào số ngẫu nhiên.
- Go 1.22 được kỳ vọng sẽ tạo ảnh hưởng tích cực đến cộng đồng Go bằng cách cung cấp nhiều tối ưu hóa và tính năng mới giúp cải thiện hiệu năng cũng như trải nghiệm của nhà phát triển, trong khi vẫn duy trì tính tương thích.
1 bình luận
Ý kiến trên Hacker News
io.Copygiờ đây có thể sử dụng system callsplice(2)của Linux khi sao chép từ TCPConn sang UnixConn. Họ đánh giá cao lợi ích có thể đạt được từ kiểu mẫu như vậy trong góiio.httpmuxgo121.sql.Null[T]. Trước đây họ dùngnullcủasqlboiler; nó có API tương tựsql.Null, đồng thời còn có thêm phương thứcIsSet() boolđể cho biết giá trị đã được thiết lập một cách tường minh hay chưa.chihay không.any.