Blog Go
Go 1.27 được phát hành
Hôm nay nhóm Go vui mừng bản phát hành Go 1.27. Bạn có thể tìm thấy các kho lưu trữ binary và trình cài đặt của bản phát hành này trên trang tải xuống.
Go 1.27 mang đến những cải tiến lớn trên ngôn ngữ, toolchain, runtime và thư viện chuẩn. Dưới đây là một số điểm nổi bật chính.
Các thay đổi về ngôn ngữ
Go 1.27 giới thiệu ba cập nhật đáng chú ý cho đặc tả ngôn ngữ.
Đầu tiên, các phương thức generic hiện đã được hỗ trợ. Ví dụ, xem math/rand/v2.Rand:
// Trước Go 1.27, phải thêm một phương thức riêng trên Rand cho từng kiểu
// (lược bỏ các phương thức cho số nguyên không dấu để ngắn gọn).
func (r *Rand) Int32N(n int32) int32
func (r *Rand) Int64N(n int64) int64
func (r *Rand) IntN(n int) int
// Go 1.27 thêm một phương thức generic mới hoạt động với mọi kiểu số nguyên.
func (r *Rand) N[Int intType](n Int) Int
Thứ hai, khóa trong một struct literal giờ đây có thể là bất kỳ field selector hợp lệ nào của kiểu struct, cho phép khởi tạo trực tiếp các trường trong các struct lồng nhau hoặc được nhúng:
type Habitat struct {
Burrow string
}
type Gopher struct {
Name string
Habitat // Struct được nhúng.
}
// Go 1.27 cho phép sử dụng Burrow trực tiếp làm khóa.
g := Gopher{
Name: "Gopher",
Burrow: "Burrow #42",
}
Cuối cùng, suy luận kiểu của hàm đã được tổng quát hóa để áp dụng trong mọi ngữ cảnh gán. Các hàm generic giờ đây có thể được sử dụng mà không cần đối số kiểu tường minh trong các struct literal, phép chuyển đổi kiểu và thao tác gửi qua channel:
func GenericFormatter[T any](v T) string {
return fmt.Sprintf("value: %v", v)
}
type IntFormatter func(int) string
// Go 1.27 suy luận T = int trong struct literal, phép chuyển đổi và thao tác gửi qua channel.
formatters := []IntFormatter{GenericFormatter}
fn := IntFormatter(GenericFormatter)
ch := make(chan IntFormatter, 1)
ch <- GenericFormatter
Cải tiến công cụ
go fixbao gồm một số modernizer mới:atomictypes,embedlit,slicesbackwardvàunsafefuncs.go dochiện hỗ trợ các truy vấnpackage@versionnhưgo doc example.com/pkg@v1.2.3.go mod tidyhiện tự động hợp nhất nhiều khốirequiretronggo.modthành cấu trúc hai khối chuẩn gồm direct và indirect.
Hiệu năng và runtime
giảm chi phí cấp phát các đối tượng nhỏ (<80B) tới 30%, cải thiện hiệu năng
tổng thể khoảng ~1% đối với các chương trình có nhiều hoạt động cấp phát.
- Hồ sơ
goroutineleaktrong
runtime/pprof hiện đã được cung cấp rộng rãi, cho phép
tự động phát hiện các goroutine bị chặn vĩnh viễn.
Các bổ sung cho thư viện chuẩn
encoding/json/v2cung cấp khả năng xử lý JSON cấp cao
với các tùy chọn có thể cấu hình và các giá trị mặc định nghiêm ngặt hơn,
đồng thời có encoding/json/jsontext cho việc truyền
dữ liệu streaming cấp thấp. Gói encoding/json hiện có
được hỗ trợ bởi triển khai v2 để giải mã nhanh hơn trong khi vẫn duy trì khả
năng tương thích ngược.
crypto/mldsatriển khai lược đồ chữ ký
ML-DSA hậu lượng tử (FIPS 204), được tích hợp vào
uuidcung cấp hỗ trợ gốc cho việc tạo và phân tích
UUID.
simdvà
simd/archsimd dành riêng cho từng kiến trúc cung cấp
hỗ trợ SIMD thử nghiệm.
net/http/httptestbổ sung
NewTestServer, cung cấp một mạng
giả lập trong bộ nhớ phù hợp để sử dụng với gói
Vui lòng đọc ghi chú bản phát hành Go 1.27 để xem danh sách đầy đủ
các thay đổi và chi tiết.
Trong vài tuần tới, các bài đăng blog tiếp theo sẽ trình bày chi tiết hơn một số
chủ đề liên quan đến Go 1.27. Hãy quay lại sau để đọc các bài viết đó.
Cảm ơn tất cả mọi người đã đóng góp cho bản phát hành này bằng cách viết mã,
báo lỗi, dùng thử các bổ sung thử nghiệm và kiểm thử các bản ứng viên phát hành.
Như thường lệ, nếu bạn nhận thấy bất kỳ vấn đề nào, vui lòng báo cáo một issue.
Chúng tôi hy vọng bạn thích sử dụng Go 1.27!
Bài tiếp theo: Phương thức generic
Bài trước: Giới thiệu API của pkg.go.dev
Mục lục blog