3 điểm bởi lemonmint 2024-12-20 | 4 bình luận | Chia sẻ qua WhatsApp

[IMG] Overview of Go 1.24

Phiên bản Go 1.24 dường như sẽ là một bản phát hành quan trọng, giới thiệu nhiều cải tiến tập trung vào hiệu năng, bảo mật và trải nghiệm nhà phát triển. Những thay đổi này nhằm giúp Go trở nên mạnh mẽ và hiệu quả hơn trong việc xây dựng các ứng dụng hiện đại.

Cải thiện hiệu năng

Đã có những cải thiện hiệu năng tổng quát, giúp giảm 2~3% chi phí CPU trong bộ benchmark tiêu biểu. Các cải tiến này bao gồm triển khai map tích hợp mới, cấp phát bộ nhớ hiệu quả hơn cho các đối tượng nhỏ và triển khai mutex nội bộ runtime mới. Kết quả có thể khác nhau tùy theo ứng dụng.

Mật mã kháng lượng tử

Gói crypto/mlkem triển khai ML-KEM-768 và ML-KEM-1024 đã được giới thiệu. ML-KEM trước đây được biết đến với tên Kyber và là cơ chế trao đổi khóa kháng lượng tử được quy định trong FIPS 203. Sự bổ sung này giúp Go sẵn sàng hơn cho an toàn mật mã trong tương lai.

Encrypted Client Hello

Hỗ trợ ECH (Encrypted Client Hello) trong TLS. Tính năng này có thể được bật bằng cách điền trường Config.EncryptedClientHelloKeys, qua đó tăng cường quyền riêng tư và bảo mật của kết nối TLS.

Swiss Table Map mới

Một triển khai map được cải thiện để đạt hiệu năng tốt hơn. Triển khai mới này dựa trên Swiss Tables và có thể bị vô hiệu hóa bằng cờ build GOEXPERIMENT=noswissmap.

Cập nhật Sync Map

Hiệu năng chỉnh sửa map trong sync.Map đã được cải thiện. Việc chỉnh sửa các tập khóa tách biệt ít có khả năng tranh chấp hơn nhiều trên các map lớn, và không còn cần thời gian chuẩn bị để đạt tải tranh chấp thấp trên map. Nếu gặp vấn đề, có thể quay lại triển khai cũ bằng GOEXPERIMENT=nosynchashtriemap.

Cải thiện JSON marshaling

Tùy chọn thẻ omitempty mới cho phép lược bỏ trường struct thông minh hơn trong quá trình JSON marshaling. Khi marshaling, nếu giá trị của trường struct có tùy chọn omitempty là 0 thì trường đó sẽ bị lược bỏ. Nếu kiểu của trường có phương thức IsZero() bool, phương thức đó sẽ được dùng để kiểm tra xem giá trị có phải là 0 hay không.

Dọn dẹp runtime

Hàm AddCleanup được giới thiệu để thay thế SetFinalizer nhằm quản lý tài nguyên tốt hơn. Không giống SetFinalizer, nó không hồi sinh các đối tượng được liên kết để phục vụ finalization, và có thể gắn nhiều cleanup vào một đối tượng duy nhất. Mã mới nên ưu tiên AddCleanup hơn SetFinalizer.

Chỉ thị tool trong go.mod

Việc theo dõi phụ thuộc công cụ đã được cải thiện nhờ chỉ thị tool trong go.mod. Điều này loại bỏ nhu cầu dùng cách workaround trước đây là thêm công cụ bằng blank import trong một tệp có tên quy ước là tools.go.

Truy cập giới hạn theo thư mục

Kiểu os.Root mới dành cho các thao tác hệ thống tệp có kiểm soát. Kiểu os.Root cung cấp khả năng thực hiện các thao tác hệ thống tệp bên trong một thư mục cụ thể, ngăn truy cập ra ngoài đường dẫn đã chỉ định.

Cải tiến kiểm thử

Gói testing/synctest mới dành cho việc kiểm thử mã đồng thời. Hàm synctest.Run khởi chạy một nhóm goroutine trong một “bubble” biệt lập, còn hàm synctest.Wait sẽ chờ cho đến khi mọi goroutine trong bubble hiện tại đều bị chặn. Gói này đang ở trạng thái thử nghiệm và cần bật bằng cách đặt GOEXPERIMENT=synctest tại thời điểm build.

Build cache

Tệp thực thi của go run nay được cache để chạy nhanh hơn. Điều này giúp các lần chạy lặp lại nhanh hơn, đổi lại cache sẽ lớn hơn.

Hiệu năng Cgo

Các annotation #cgo noescape#cgo nocallback mới giúp cải thiện hiệu năng Cgo. #cgo noescape cFunctionName cho compiler biết rằng bộ nhớ được truyền vào hàm C sẽ không escape. #cgo nocallback cFunctionName cho compiler biết rằng hàm C sẽ không gọi ngược lại hàm Go.

Weak pointer

Hỗ trợ weak pointer để tham chiếu bộ nhớ một cách an toàn mà không ngăn việc thu hồi. Weak pointer là primitive mức thấp được cung cấp để có thể tạo ra các cấu trúc tiết kiệm bộ nhớ như weak map cho liên kết giá trị, canonicalization map và nhiều loại cache khác nhau.

Cải tiến benchmark

Phương thức testing.B.Loop mới giúp benchmark nhanh hơn và ít lỗi hơn. Hàm benchmark chỉ được chạy đúng một lần cho mỗi -count, vì vậy các bước thiết lập và dọn dẹp tốn kém chỉ chạy một lần. Các tham số gọi hàm và kết quả vẫn được giữ lại, nhờ đó compiler không thể tối ưu hóa hoàn toàn phần thân vòng lặp.

Phiên bản Go 1.24 dường như sẽ là một bản phát hành quan trọng, mang lại những cải tiến đáng kể trên nhiều khía cạnh của ngôn ngữ và hệ sinh thái của nó.

4 bình luận

 
secret3056 2024-12-20

Những ai đang dùng Go có tính năng nào mong muốn không?
Tôi thì muốn có các toán tử như .???, và nếu có thể thì có cả macro.

Thành thật mà nói, struct tag là một sai lầm.

 
gkswnsqja 2024-12-20

Cá nhân tôi cũng thật sự ước là có macro, không biết còn phải generate đến bao giờ nữa hu hu

 
qkrqjadn 2024-12-20

Tôi tò mò vì sao struct tag lại bị coi là một sai lầm.

 
secret3056 2024-12-20

Vấn đề lớn nhất là rất khó nhận được sự hỗ trợ từ công cụ.

  • Vì là chuỗi nên dù gõ sai cũng rất khó phát hiện lỗi.
  • Ngoại trừ JSON thì không có tự động hoàn thành hay IntelliSense.
  • Khi dùng nhiều công cụ, phải viết tất cả trên một dòng nên khó tránh khỏi cảm giác khả năng đọc bị giảm.

gomodifytags cũng đã ra mắt từ lâu, nhưng việc tích hợp với extension Go của VSC cũng khá muộn.