Go 1.27 ra mắt: generic methods chính thức, JSON v2 nhanh hơn

Ngày 19/8/2026, đội ngũ Go phát hành Go 1.27, một bản "minor" mang tầm vóc của một bản major. Cái tên nổi bật nhất là generic methods: phương thức của một kiểu giờ có thể mang tham số kiểu riêng, mảnh ghép mà cộng đồng chờ suốt từ khi generics xuất hiện ở Go 1.18 năm 2022.
Không chỉ vậy. Bản này còn kéo theo một gói JSON mới, chữ ký hậu lượng tử (post-quantum) vào thẳng thư viện chuẩn, và hàng loạt tiện ích nhỏ dùng được ngay. Trên Hacker News, thread công bố đạt 345 điểm và khoảng 70 bình luận, con số đáng kể cho một bản release ngôn ngữ.
Generic methods: mảnh ghép cuối của generics
Go 1.18 đưa generics vào, nhưng chừa một lỗ hổng lớn: hàm và kiểu thì generic được, còn phương thức thì không. Muốn có phương thức sinh số ngẫu nhiên cho int32, int64, int, bạn phải viết ba hàm riêng.
// Trước Go 1.27: mỗi kiểu một phương thức.
func (r *Rand) Int32N(n int32) int32
func (r *Rand) Int64N(n int64) int64
func (r *Rand) IntN(n int) int
// Go 1.27: một phương thức generic cho mọi kiểu số nguyên.
func (r *Rand) N[Int intType](n Int) Int
Đây không chỉ là chuyện gõ ít code hơn. Nó cho phép viết những interface và abstraction mà trước đây buộc phải dùng đến code generation hoặc reflection lúc chạy. Một bình luận trong thread kể về việc build một handler/controller chung để nạp dữ liệu tham số từ request body — thứ mà generic method giờ giải quyết gọn gàng.
Đi kèm còn hai thay đổi ngôn ngữ nữa. Thứ nhất, key trong struct literal giờ có thể là field selector bất kỳ, nghĩa là bạn khởi tạo trực tiếp field của struct lồng hoặc struct được nhúng:
type Habitat struct { Burrow string }
type Gopher struct { Name string; Habitat }
// Go 1.27 cho phép dùng Burrow làm key trực tiếp.
g := Gopher{ Name: "Gopher", Burrow: "Burrow #42" }
Thứ hai, suy diễn kiểu hàm được tổng quát hóa cho mọi ngữ cảnh gán — composite literal, type conversion, cả channel send. Những hàm generic giờ dùng được mà không cần khai báo tham số kiểu tường minh.
JSON v2: nhanh hơn mà không cần sửa code
Gói encoding/json cũ giờ được hậu thuẫn bởi một bản triển khai mới, encoding/json/v2, cùng gói low-level encoding/json/jsontext cho việc xử lý streaming. Điểm đáng chú ý: unmarshal nhanh hơn, nhưng tương thích ngược — code hiện tại không phải sửa gì để hưởng lợi.
Đây là kiểu nâng cấp hiếm: một trong những gói được dùng nhiều nhất hệ sinh thái Go được viết lại ngầm bên dưới, còn bề mặt API giữ nguyên. Với các dịch vụ parse JSON nặng, đây gần như là cải thiện miễn phí sau khi nâng Go.
Crypto hậu lượng tử vào thư viện chuẩn
Go 1.27 thêm crypto/mldsa, triển khai ML-DSA, tích hợp thẳng vào crypto/x509 và crypto/tls. Đây là chuẩn chữ ký hậu lượng tử của NIST (FIPS 204).
Vì sao chuyện này đáng quan tâm với một developer bình thường? Mối đe dọa "harvest now, decrypt later": dữ liệu mã hóa hôm nay có thể bị lưu lại và giải mã sau này khi máy tính lượng tử đủ mạnh. Chữ ký số cũng nằm trong rủi ro đó — một chữ ký bị bẻ sau này có thể làm mất hiệu lực xác thực của phần mềm đã ký. Việc Go đưa ML-DSA vào stdlib đồng nghĩa toàn bộ bộ máy chữ ký hậu lượng tử giờ có sẵn mà không cần phụ thuộc thư viện bên thứ ba.
Một bình luận trong thread nhận xét đây không phải chuyện đột ngột — NIST đã cảnh báo "chuyển sang hậu lượng tử" từ một thập kỷ trước, và các hệ sinh thái lớn (.NET 11 chẳng hạn) cũng đang chạy đua tương tự.
Những thứ nhỏ, dùng được ngay
Phần còn lại của bản release không ồn ào bằng nhưng đáng giá:
uuidchuẩn: sinh và parse UUID ngay trong stdlib, không cầngithub.com/google/uuidnữa. Nhiều người trong thread cho biết đã thay ngay.goroutineleakprofile GA: profile trongruntime/pprofgiờ chính thức, tự phát hiện goroutine bị block vĩnh viễn — thứ từng rất khó debug trong hệ thống concurrent.go fixmodernizers mới:atomictypes,embedlit,slicesbackward,unsafefuncstự động hiện đại hóa code cũ.go doc package@version: truy vấn tài liệu theo version cụ thể.simd(experimental): hỗ trợ SIMD, kèm ghi chú thú vị từ cộng đồng rằng LLM làm "scalar-to-SIMD transpiler" khá tốt.
Về hiệu năng, cấp phát bộ nhớ theo kích thước giúp giảm chi phí cho object nhỏ (dưới 80 byte) tới 30%, tương đương khoảng 1% tổng thể cho chương trình cấp phát bộ nhớ nhiều.
Go đang đánh mất sự "đơn giản"?
Trong thread có một bình luận thẳng thắn gọi Go đang tiến về phía "một C# hay Java Frankenstein": ngôn ngữ từng được quảng bá là "đơn giản", từng tự hào vì không có generics, giờ dồn tính năng ngày một nhiều. Đây là căng thẳng cũ của Go: mỗi bản release thêm tính năng, và ranh giới "đơn giản" ngày càng mờ.
Nhưng lập luận ngược lại cũng có lý: các tính năng này đều mang tính bổ sung và tùy chọn. Code Go 1.18 vẫn chạy trên Go 1.27 mà không phá vỡ gì — đó là cam kết tương thích ngược mà team Go duy trì như một tính năng ngôn ngữ. Và điều cộng đồng thực sự còn thiếu — discriminated unions — vẫn chưa có, đang nằm ở proposal issue #76920.
Điều cần biết
- Generic methods vá lỗ hổng lớn nhất còn lại của generics — áp dụng ngay khi viết abstraction chung.
encoding/jsonnhanh hơn ngầm bên dưới, không cần sửa code để hưởng lợi.crypto/mldsađưa chữ ký hậu lượng tử (FIPS 204) vàocrypto/tls/crypto/x509— bắt đầu cân nhắc cho hạ tầng xác thực.uuidvàgoroutineleakprofile là hai thứ đáng đổi sang dùng ngay.simdvẫn experimental — thử được, nhưng đừng đặt vào production vội.
Bản release này nói lên một điều về cách Go vận hành: thay vì một Go 2 phá vỡ mọi thứ, team Go gom những thay đổi tầm cỡ major vào từng bản minor, giữ cho cả hệ sinh thái chạy tiếp mà vẫn tiến về phía trước. Câu hỏi còn lại không phải Go có thêm tính năng hay không, mà là khi nào "đơn giản" trở thành cái giá phải trả.
Bài viết được hỗ trợ bởi AI (Amy 🌸). Nội dung đã được kiểm duyệt bởi tác giả.
Related Posts
Rust Glancer: LSP Rust mới chỉ dùng dưới 100MB RAM
rust-analyzer ngốn hàng GB RAM vì kiến trúc incremental. Rust Glancer đi ngược lại: index một lần, lưu ra ổ đĩa, idle dưới 100MB.
Stripe mua OpenRouter 7 tỷ USD: 'Stripe của AI' về tay Stripe
Stripe chốt thỏa thuận mua OpenRouter hơn 7 tỷ USD — 'Stripe của AI' giờ thuộc về Stripe thật. Tầng định tuyến AI vừa được định giá lại.
GigaToken: Tokenizer Nhanh Gấp 1000 Lần — Điều Developer Cần Biết
Tokenizer LLM đạt 24.53 GB/s, nhanh gấp ~1000 lần HuggingFace và ~700 lần tiktoken. Viết bằng Rust, dùng SIMD. Không chỉ nhanh: nó thay đổi cách xử lý dữ liệu cho LLM.