1 điểm bởi GN⁺ 2024-02-08 | 1 bình luận | Chia sẻ qua WhatsApp
  • Phiên bản Go 1.22 được phát hành sau 6 tháng kể từ Go 1.21.
  • Hầu hết các thay đổi nằm ở phần triển khai của toolchain, runtime và thư viện.
  • Vẫn giữ cam kết tương thích Go 1, và gần như mọi chương trình Go đều được kỳ vọng sẽ biên dịch và chạy như trước.

Thay đổi ngôn ngữ

  • Có hai thay đổi đối với vòng lặp "for".
    • Trước đây, các biến được khai báo bởi vòng lặp "for" được tạo một lần và được cập nhật qua mỗi lần lặp, nhưng trong Go 1.22, mỗi lần lặp của vòng lặp sẽ tạo ra biến mới để ngăn lỗi chia sẻ ngoài ý muốn.
    • Vòng lặp "for" giờ đây có thể range trên số nguyên.

Công cụ

Lệnh Go

  • Có thể quản lý phụ thuộc bằng thư mục vendor trong workspace.
  • go get không còn được hỗ trợ trong chế độ GOPATH cũ, không dùng module.
  • go mod init giờ đây không còn cố gắng nhập các yêu cầu module từ tệp cấu hình của các công cụ vendoring khác.
  • go test -cover giờ đây xuất bản tóm tắt coverage cho các package không có tệp kiểm thử riêng.

Trace

  • Web UI của công cụ trace đã được thiết kế lại một phần để hỗ trợ tracer mới.

Vet

  • Hành vi của công cụ vet đối với biến vòng lặp đã thay đổi.
  • Đã thêm cảnh báo mới cho các lời gọi append không thêm giá trị nào.
  • Đã thêm cảnh báo mới cho vấn đề phát sinh khi dùng time.Since trong câu lệnh defer.
  • Đã thêm cảnh báo mới khi các cặp key-value không khớp trong lời gọi log/slog.

Runtime

  • Cải thiện hiệu năng CPU 1-3% bằng cách giữ metadata garbage collection dựa trên kiểu gần hơn với các đối tượng heap.

Compiler

  • Các bản build tối ưu hóa theo hồ sơ (PGO) giờ đây có thể devirtualize nhiều lời gọi hơn trước.

Linker

  • Các cờ -s-w của linker đã được thay đổi để hoạt động nhất quán hơn trên mọi nền tảng.

Bootstrap

  • Go 1.22 yêu cầu bản phát hành point release cuối cùng của Go 1.20 trở lên để bootstrap.

Thư viện lõi

Gói math/rand/v2 mới

  • math/rand/v2 là gói “v2” đầu tiên của thư viện chuẩn, với nhiều thay đổi quan trọng so với math/rand.

Gói go/version mới

  • Đã thêm gói go/version mới, triển khai các hàm để kiểm tra tính hợp lệ và so sánh chuỗi phiên bản Go.

Mẫu định tuyến được cải tiến

  • Khả năng định tuyến HTTP trong thư viện chuẩn đã được cải thiện để biểu đạt linh hoạt hơn.

Những thay đổi nhỏ trong thư viện

  • Có nhiều thay đổi nhỏ và cải thiện hiệu năng trên các thư viện khác nhau.

Port

Darwin

  • Trên macOS, với kiến trúc x86 64-bit (darwin/amd64 port), toolchain Go giờ đây mặc định tạo ra tệp thực thi độc lập vị trí (PIE).

Arm

  • Có thể dùng biến môi trường GOARM để chọn floating point bằng phần mềm hoặc phần cứng.

Loong64

  • loong64 port giờ đây truyền tham số hàm và kết quả bằng thanh ghi.

OpenBSD

  • Đã bổ sung port thử nghiệm cho big-endian PowerPC 64-bit (openbsd/ppc64) trên OpenBSD.

Ý kiến của GN⁺

  • Bản phát hành Go 1.22 lần này đặc biệt đáng chú ý với các thay đổi trong vòng lặp "for" và việc giới thiệu gói math/rand/v2 mới. Những thay đổi này mang lại hiệu năng và độ ổn định tốt hơn cho các nhà phát triển Go, đồng thời các tính năng mới phản ánh sự phát triển của ngôn ngữ Go.
  • Gói math/rand/v2 cung cấp khả năng sinh số ngẫu nhiên tốt hơn thông qua các thuật toán nhanh hơn và API mới, đây là cải tiến quan trọng cho mã hóa và các ứng dụng khác phụ thuộc vào số ngẫu nhiên.
  • Go 1.22 được kỳ vọng sẽ tạo ảnh hưởng tích cực đến cộng đồng Go bằng cách cung cấp nhiều tối ưu hóa và tính năng mới giúp cải thiện hiệu năng cũng như trải nghiệm của nhà phát triển, trong khi vẫn duy trì tính tương thích.

1 bình luận

 
GN⁺ 2024-02-08
Ý kiến trên Hacker News
  • Một lập trình viên TypeScript chia sẻ trải nghiệm gần đây khi chuyển sang ngôn ngữ Go. Ban đầu họ bày tỏ lo ngại về việc Go thiếu các hàm xử lý mảng và hệ thống kiểu không linh hoạt. Tuy nhiên, khi dùng Go, họ cảm nhận được sự xuất sắc của thư viện chuẩn, tính an toàn kiểu và lợi ích của các chuẩn viết mã được tích hợp sẵn. Việc routing được tích hợp vào thư viện chuẩn cũng được đánh giá tích cực.
  • Chia sẻ một liên kết cung cấp release notes tương tác cho phiên bản Go 1.22.
  • Một lập trình viên đã dùng Go hơn 9 năm so sánh Dart (để phát triển Flutter) với Go. Dart cố gắng bổ sung mọi tính năng có thể, trong khi Go thì ngược lại, theo đuổi sự đơn giản. Trong Dart, các cách khởi tạo class trở nên quá đa dạng nên dễ gây rối, khiến họ nhớ sự đơn giản của Go. Những biểu thức đơn phức tạp dùng map/stream trong Dart có thể gây bối rối khi debug hoặc với lập trình viên mới.
  • io.Copy giờ đây có thể sử dụng system call splice(2) của Linux khi sao chép từ TCPConn sang UnixConn. Họ đánh giá cao lợi ích có thể đạt được từ kiểu mẫu như vậy trong gói io.
  • Các mẫu routing đã được cải thiện trong Go 1.22, nhưng điều này có thể gây ra một số vấn đề tương thích nhỏ. Việc này có thể được kiểm soát thông qua trường httpmuxgo121.
  • Một số lập trình viên không thích tính năng “function scope” được thêm vào Go. Họ cho rằng tính năng này không mang lại đủ tiện ích so với độ phức tạp bổ sung cho ngôn ngữ, và không phù hợp với phong cách tường minh, đơn giản của Go.
  • Chia sẻ liên kết thảo luận về việc mỗi lần lặp của vòng lặp trong Go 1.22 tạo ra một biến mới.
  • Hoan nghênh việc bổ sung sql.Null[T]. Trước đây họ dùng null của sqlboiler; nó có API tương tự sql.Null, đồng thời còn có thêm phương thức IsSet() bool để cho biết giá trị đã được thiết lập một cách tường minh hay chưa.
  • Hoan nghênh việc routing được thêm vào thư viện chuẩn và đang cân nhắc liệu có thể loại bỏ thư viện chi hay không.
  • Có câu hỏi trong giới lập trình viên dùng Go ở production về việc họ có nhanh chóng chuyển sang phiên bản mới hay tiếp tục ở lại với các bản phát hành cũ hơn. Mọi người cũng chia sẻ ý kiến về việc sử dụng từ khóa any.