- Nhân dịp 16 năm Go được phát hành mã nguồn mở, bài viết tổng hợp những tiến bộ kỹ thuật chính trong 1 năm gần đây và các kế hoạch sắp tới
- Ở các phiên bản Go 1.24 và 1.25, đã có những cải tiến quy mô lớn trên toàn diện về kiểm thử·bảo mật·hiệu năng
- Các tính năng như
synctest, container-aware scheduling, flight recorder giúp tăng cường độ tin cậy và hiệu quả của môi trường production
- Chuẩn bị chứng nhận FIPS 140-3 cho các gói mật mã, Green Tea GC cùng nhiều cải tiến khác giúp nâng cao bảo mật và hiệu năng
- Hệ sinh thái Go đang mở rộng theo hướng phát triển tích hợp AI và tự động hóa mã hiện đại, đồng thời dự kiến tăng cường hỗ trợ cho phần cứng quy mô lớn và AI trong tương lai
Kỷ niệm 16 năm Go và tổng quan các bản phát hành gần đây
- Kỷ niệm 16 năm kể từ ngày 10 tháng 11 Go được công bố dưới dạng mã nguồn mở
- Tháng 2 năm 2024 phát hành Go 1.24, tháng 8 phát hành Go 1.25 theo chu kỳ phát hành định kỳ
- Hai phiên bản này bao gồm API cho phát triển phần mềm có độ tin cậy cao, tăng cường bảo mật, và cải thiện hiệu năng runtime
- Nhóm Go đang thúc đẩy phát triển AI tích hợp·agent·hạ tầng dựa trên Go để đáp ứng những thay đổi của thời đại AI tạo sinh
Những cải tiến cốt lõi về ngôn ngữ và thư viện chuẩn
- Gói
testing/synctest được đưa vào thử nghiệm ở Go 1.24 và chính thức hóa ở 1.25 giúp đơn giản hóa việc kiểm thử mã bất đồng bộ và song song
- Thông qua ảo hóa thời gian, các bài test chậm hoặc thiếu ổn định có thể được chuyển thành các bài test đáng tin cậy và cho kết quả tức thì
- Có cấu trúc tích hợp sâu với Go runtime và thư viện chuẩn
- API
testing.B.Loop cải thiện tính dễ dùng của API benchmark cũ (B.N) và loại bỏ những cạm bẫy truyền thống
- Đã bổ sung API dọn dẹp test và xuất log dựa trên
Context, giúp nâng cao hiệu quả quản lý kiểm thử
- Go 1.25 giới thiệu container-aware scheduling để tự động điều chỉnh mức độ xử lý song song bên trong container
- Ngăn CPU throttling và cải thiện độ trễ
- Tính năng flight recorder mở rộng trình theo dõi thực thi, cho phép ghi chi tiết các sự kiện ngay trước khi lỗi xảy ra
Phát triển phần mềm lấy bảo mật làm trọng tâm
- Các gói mật mã của Go trong đợt kiểm toán của công ty bảo mật độc lập Trail of Bits chỉ phát hiện một vấn đề duy nhất ở mức độ nghiêm trọng thấp
- Với sự hợp tác giữa Go Security Team và Geomys, Go đã đạt chứng nhận CAVP và hoàn tất chuẩn bị cho chứng nhận FIPS 140-3
- Giúp tăng khả năng sử dụng Go trong môi trường bị ràng buộc bởi quy định, đồng thời giải quyết vấn đề phụ thuộc vào các giải pháp không chính thức trước đây
- Thư viện chuẩn của Go đang phát triển theo hướng an toàn theo mặc định (safe by default)
- API
os.Root trong Go 1.24 ngăn chặn lỗ hổng path traversal khi truy cập hệ thống tệp
Cải tiến cấu trúc bên trong và hiệu năng
- Trong Go 1.24, cách triển khai
map được thiết kế lại hoàn toàn, phản ánh các thiết kế hash table hiện đại
- Cải thiện hiệu năng, giảm độ trễ, và nâng cao hiệu quả bộ nhớ
- Garbage collector Green Tea của Go 1.25 giảm chi phí GC từ 10~40%
- Áp dụng thuật toán mới phù hợp với phần cứng hiện đại
- Ở Go 1.26 dự kiến có thêm 10% cải thiện trên phần cứng hỗ trợ AVX-512
- Dự kiến được bật mặc định từ Go 1.26
Mở rộng stack phát triển và tích hợp AI
- Go đang phát triển vượt ra ngoài một ngôn ngữ để trở thành một nền tảng phát triển hoàn chỉnh
- Language server gopls được tăng cường tính năng qua 4 bản phát hành định kỳ (v0.17~v0.20)
- Bổ sung bộ phân tích mã, refactoring, xử lý JSON tag, MCP server tích hợp sẵn cùng nhiều tính năng khác
- Đã đưa vào tính năng tự động hiện đại hóa mã (modernizer)
- Tự động chuyển các mẫu mã cũ sang dạng mới và an toàn hơn
- Tích hợp với tính năng gợi ý trong IDE để giúp duy trì mã nhất quán và hỗ trợ việc học của công cụ AI
- Trong Go 1.26, lệnh
go fix dự kiến sẽ được cải tổ để áp dụng toàn bộ modernizer cùng lúc
- Thông qua hợp tác với Anthropic và cộng đồng, Go SDK chính thức v1.0.0 cho Model Context Protocol (MCP) đã được công bố
- Hỗ trợ client·server MCP, dựa trên các tính năng MCP của gopls
- ADK for Go của Google cung cấp framework phát triển hệ thống đa agent trên nền MCP SDK
- Điều này chứng minh tính đồng thời·hiệu năng·độ tin cậy của Go phù hợp với phát triển AI production
Kế hoạch sắp tới và cộng đồng
- Dự kiến triển khai Green Tea GC ở mức phổ biến rộng rãi, hỗ trợ phần cứng SIMD, và tăng cường khả năng mở rộng đa lõi
- Đang tiến hành các hạng mục như nâng cấp lớn cho
encoding/json, profiling rò rỉ goroutine, cải thiện net/http·unicode
- Mở rộng ngôn ngữ·công cụ·hệ thống chẩn đoán để kết hợp Go với AI
- Dự án mã nguồn mở Go đặt mục tiêu mở rộng cộng đồng đóng góp và khả năng mở rộng của quy trình phát triển
- Sự phát triển của Go dựa trên đóng góp từ cộng đồng người dùng và cộng tác viên, đồng thời báo hiệu tăng trưởng bền vững trong tương lai
1 bình luận
Ý kiến trên Hacker News
Tôi thật sự rất thích Go. Nó đặc biệt tỏa sáng trong môi trường monorepo. Khi thêm một ứng dụng mới, chỉ cần tạo một thư mục và đặt vào đó một file go có hàm
main(). Chạygo install ./...từ thư mục gốc là toàn bộ sẽ được build rất nhanh.Khi cần làm nhanh một chương trình CLI, sự đơn giản này thật sự là một nước đi thần thánh
Ngày trước người ta thường nói ngôn ngữ không phải là nút thắt cổ chai, nhưng khi lần đầu nhìn thấy Go tôi đã nghĩ “cái này khác đấy”. Nó cũng học rất nhanh — có lẽ vì đặc tả ngôn ngữ nhỏ.
Cảm giác như nhận được 80% tính năng của Rust với 20% công sức
Với tôi, Go giống như Rust bị đơn giản hóa quá mức. Tự động sửa mã, ép buộc kiểu vòng lặp, hay kiểm tra sự tồn tại của key trong map đều thấy bất tiện.
Xử lý mảng hay định nghĩa enum cũng gượng gạo, và vì các quy tắc linter của công ty nên code bị chia nhỏ ra, trông cứ như Java doanh nghiệp.
Dù vậy interface thì đơn giản, học cũng nhanh.
Nếu Go có enum đúng nghĩa, cú pháp slice tự nhiên hơn, iterator, cú pháp rút gọn để unwrap kết quả thì sẽ tốt hơn rất nhiều
Thư viện json mặc định cũng có nhiều vấn đề như serialize slice rỗng thành null.
Dù vậy tôi vẫn công nhận tốc độ tooling của nó rất nhanh và tính thực dụng rất cao
Unwrap kết quả là chuyện cộng đồng đã bàn suốt nhiều năm nhưng vẫn chưa có lời giải gọn gàng
Nếu bạn thường xuyên xóa phần tử ở giữa mảng thì có lẽ bạn đã chọn sai cấu trúc dữ liệu
slices.Delete, còn chuyện ép buộc kiểuif err != nilkhông phải vấn đề của ngôn ngữ mà là vấn đề quy tắc của đội nhómTôi đã thoáng kỳ vọng vì tưởng Go sẽ được phát hành cho Apple II (tham khảo SWEET16)
Việc đóng góp vào một codebase Go mới rất dễ.
Nhờ sự đơn giản của ngôn ngữ và các công cụ chuẩn như gofmt, golangci-lint, mọi codebase đều có cấu trúc tương tự nhau.
Không có tranh cãi về công cụ build như ở các cộng đồng ngôn ngữ khác
Tuy vậy cách toán tử
%xử lý số âm làm tôi hơi bối rốiViệc đưa vào công cụ hiện đại hóa mã tự động (modernizer) rất thú vị.
Từ gopls v0.18.0, nó dùng phân tích cú pháp để tìm các thành ngữ cũ và tự động chuyển thành mã nhanh hơn, an toàn hơn.
Giống như gofmt đã tạo ra sự nhất quán về style, modernizer sẽ tạo ra sự nhất quán về thành ngữ
Nếu bật các linter như exhaustive, exhaustruct, wrapcheck trong golangci-lint thì độ an toàn tăng lên đáng kể và tốc độ phát triển cũng nhanh hơn
Ở công ty tôi, chúng tôi đang vận hành một chương trình onboarding 10 tuần cho lập trình viên backend Go (liên kết kế hoạch)
Tôi đã chuyển từ Python sang Go được 7 năm, và đây là yếu tố cốt lõi cho thành công của startup
Lúc đầu tôi nghi ngờ Go, nhưng giờ nó là ngôn ngữ tôi thích nhất. Đơn giản mà vẫn mạnh mẽ.
Tuy vậy sẽ tốt hơn nếu mặc định có kiểm tra null, stack trace cho lỗi, và kiểm tra exhaustive cho sum type
Tôi nghĩ Go sẽ gần như hoàn hảo nếu có thêm một chút tính năng liên quan đến lập trình hàm.
Đặc biệt là tính bất biến, xử lý null, và switch exhaustiveness còn đáng tiếc.
Tôi đang bù đắp bằng cách dùng NilAway của Uber, nhưng sẽ tốt hơn nếu được hỗ trợ ở cấp hệ thống kiểu