Phát hành Go 1.24
(go.dev)- Go 1.24 là bản cập nhật chính thức sau Go 1.23, bao gồm nhiều thay đổi mà lập trình viên có thể cảm nhận ngay, từ tính năng ngôn ngữ đến runtime, thư viện chuẩn và WebAssembly
- Ở cấp độ ngôn ngữ, phiên bản này hỗ trợ đầy đủ generic type aliases, cho phép type alias cũng có thể được tham số hóa như defined type
- Runtime có
mapmới dựa trên Swiss Tables, cải thiện cấp phát cho đối tượng nhỏ và thay đổi mutex nội bộ, giúp giảm trung bình 2–3% CPU overhead trong các benchmark tiêu biểu - Lệnh
gobổ sung luồng theo dõi và thực thi tool dependencies của module, còngo vetphát hiện tốt hơn các lỗi khai báo liên quan đến test - Hỗ trợ thư viện chuẩn và nền tảng cũng được mở rộng, cần chú ý đến FIPS 140-3,
testing.B.Loop,os.Root,runtime.AddCleanup,go:wasmexport, cũng như build WASI reactor/library
Phạm vi thay đổi của Go 1.24
- Go 1.24 là bản phát hành chứa nhiều cải tiến so với Go 1.23; có thể xem danh sách thay đổi đầy đủ tại Go 1.24 release notes
- Có thể tải phiên bản mới từ trang tải xuống của Go
Thay đổi ngôn ngữ: generic type aliases
- Go 1.24 hỗ trợ đầy đủ generic type aliases
- Type alias cũng có thể được tham số hóa như defined type, mở rộng phạm vi biểu đạt trong mã generic
- Cú pháp chi tiết có trong language spec
Cải thiện hiệu năng runtime
- Các cải tiến trong runtime giúp giảm trung bình 2–3% CPU overhead trên nhóm benchmark tiêu biểu
- Có ba trục thay đổi hiệu năng chính
- Triển khai
maptích hợp mới dựa trên Swiss Tables - Cấp phát bộ nhớ hiệu quả hơn cho các đối tượng nhỏ
- Triển khai mutex nội bộ mới của runtime
- Triển khai
Cải thiện công cụ Go
- Lệnh
gocung cấp cơ chế theo dõi tool dependencies của modulego get -toolthêm chỉ thịtoolvào module hiện tạigo tool [tool name]chạy công cụ được khai báo trong chỉ thịtool- Xem thêm trong mục go command của release notes
- Lệnh con
go vetcó thêm bộ phân tíchtestmới- Báo các lỗi phổ biến trong khai báo test, fuzzer, benchmark và example của gói kiểm thử
- Xem thêm trong mục vet của release notes
Bổ sung thư viện chuẩn và API runtime
- Thư viện chuẩn bao gồm một nhóm cơ chế mới hỗ trợ tuân thủ FIPS 140-3
- Không cần thay đổi mã nguồn ứng dụng để dùng cơ chế mới cho các thuật toán được phê duyệt
- Xem thêm trong mục FIPS 140-3 compliance của release notes
- Ngoài FIPS 140, một số package trước đây nằm trong module x/crypto nay cũng có sẵn trong thư viện chuẩn
- Mã benchmark có thể dùng phương thức
testing.B.Loop- Thực hiện lặp benchmark theo dạng
for b.Loop() { ... } - Có thể thay thế cấu trúc lặp phổ biến dùng
b.Nnhưfor range b.N - Cách này nhanh hơn và ít khả năng gây lỗi hơn
- Thực hiện lặp benchmark theo dạng
- Kiểu mới
os.Rootcho phép thực hiện thao tác hệ thống tệp bị cô lập trong một thư mục cụ thể - Runtime bổ sung cơ chế dọn dẹp mới
runtime.AddCleanup- Linh hoạt hơn, hiệu quả hơn và ít khả năng gây lỗi hơn so với
runtime.SetFinalizer
- Linh hoạt hơn, hiệu quả hơn và ít khả năng gây lỗi hơn so với
Cải thiện hỗ trợ WebAssembly
- Go 1.24 bổ sung chỉ thị
go:wasmexportmới để chương trình Go có thể export hàm cho WebAssembly host - Có thể build chương trình Go thành WASI reactor/library
- Xem thêm trong mục WebAssembly của release notes
Hướng dẫn tiếp theo và phản hồi
- Toàn bộ thông tin chi tiết có trong Go 1.24 release notes
- Một số chủ đề sẽ được đào sâu thêm trong các bài blog tiếp theo
- Nếu phát hiện vấn đề, có thể gửi issue
1 bình luận
Ý kiến trên Hacker News
Đặc biệt vui vì triển khai map nhanh hơn, và cũng tốt khi
text/templategiờ đã hỗ trợrange-over-funcGo 1.23 đã đưa range cho kiểu hàm vào, nhưng trong template của Go thì đến giờ vẫn chưa hoạt động
Tôi thích vì nó ổn định đến mức nhàm chán
Tò mò không biết
os.Rootsẽ được dùng vào việc gìTheo tôi hiểu thì nó liên quan đến bảo mật như https://github.com/golang/go/issues/67002, nhưng vì bên trong không dùng
Chroot, cuối cùng có lẽ ai đó vẫn có thể tìm ra cách thoát ra ngoài Rootchrootchỉ có ý nghĩa khi có thể khẳng định rằng ứng dụng từ nay về sau sẽ chỉ hoạt động trong một thư mục duy nhấtHơn nữa, tiến trình cần quyền superuser, nên không thể dùng cho các ứng dụng chạy với quyền người dùng thông thường
os.Root()giống như việc thắt dây an toàn cho các thao tác hệ thống tệp hơn. Ví dụ, giới hạn các thao tác liên quan đến cache của ứng dụng trong thư mục cache, hoặc để file server chỉ phục vụ các tệp trong thư mục chia sẻ phù hợp. Nó không bảo đảm kín kẽ nhưchroot, nhưng chặn được các cuộc tấn công duyệt thư mục đơn giảnchrootNếu đi cùng tính năng sandbox như Capsicum, có thể mở sẵn thư mục trước khi vào capability mode, rồi sau đó dùng
os.Rootđể mở các tệp trong cây hệ thống tệp bên dưới thư mục đã mở đóTò mò liệu có thể chỉ định tag dùng khi cài đặt công cụ được chỉ định bằng chỉ thị
toolshay khôngTôi đã thử như bên dưới, nhưng có vẻ nó được cài mà không có tag
go install -tags 'postgres' github.com/golang-migrate/migrate/v4/cmd/migrate@latestCó nói rằng nếu dùng
GODEBUG=fips140=onlythì các thuật toán mật mã không tuân thủ FIPS 140-3 sẽ trả về lỗi hoặc panic, nhưng tôi không thích lắm cách thư viện chuẩn cố ý panicTôi chưa xem code, nhưng tò mò không biết có phải vì tương thích ngược nên chỉ làm vậy ở các hàm hiện không trả về lỗi hay không
Nếu không kiểm tra lúc runtime xem FIPS có được bật hay không, sẽ có nguy cơ phá vỡ compliance, và cuối cùng dẫn đến kiểm toán cùng những cuộc họp bất tận. Tôi nghĩ một sự cố 30 phút do panic vẫn tốt hơn nhiều so với việc vất vả nhiều ngày để dựng các biện pháp kiểm soát và quy trình xác minh mới
Hành vi như vậy hữu ích trong các tình huống chỉ có thể phát hiện ở runtime. Chỉ cần có mức test coverage cơ bản là sẽ lộ ra ngay
Tôi nghi ngờ liệu điều đó có đáng mong muốn trong tình huống có mã hóa hay không. Tôi nghĩ nên tránh mức log cảnh báo. Nếu quan trọng và có thể hành động thì nên là lỗi hoặc log fatal; nếu không thì log thông tin là đủ
https://devblogs.microsoft.com/go/go-1-24-fips-update/
Cũng có thể xem đây là cách tránh các bug ẩn. Nó giống với "The server chose violence" [1] [2], và cũng đáng nghĩ xem định luật Postel đã cản trở khả năng tương tác đến mức nào. Điểm này thường bị quên trong nhiều khía cạnh của chứng nhận FIPS
[1] https://cliffle.com/blog/hubris-reply-fault/
[2] https://news.ycombinator.com/item?id=40178652
Cuối cùng bí danh kiểu generic cũng đã có, đúng là tính năng lẽ ra cần có từ lâu
Mong chờ nhất là cờ tool mới. Giờ có thể bỏ
tools.goxấu xí rồiTốt. Tôi đã chờ bản phát hành này vì
GOAUTHHy vọng làm việc với các kho git riêng tư sẽ đỡ phiền hơn, nhưng xem
go help goauththì có vẻ không nên kỳ vọng quá nhiều