Ghi chú phát hành Go 1.23

Giới thiệu Go 1.23

Bản phát hành Go mới nhất, phiên bản 1.23, ra mắt sáu tháng sau Go 1.22. Phần lớn các thay đổi nằm ở phần triển khai toolchain, runtime và thư viện. Như thường lệ, bản phát hành duy trì cam kết tương thích của Go 1. Chúng tôi kỳ vọng hầu hết các chương trình Go sẽ tiếp tục biên dịch và chạy như trước.

Thay đổi ngôn ngữ

Mệnh đề “range” trong vòng lặp “for-range” giờ chấp nhận các hàm iterator thuộc các kiểu sau

func(func() bool)
func(func(K) bool)
func(func(K, V) bool)

làm biểu thức range. Các lệnh gọi hàm đối số iterator tạo ra các giá trị lặp cho vòng lặp “for-range”. Để biết chi tiết, xem tài liệu gói iter, đặc tả ngôn ngữ, và bài viết blog Range over Function Types. Để hiểu động lực đằng sau thay đổi này, xem thảo luận “range-over-func” năm 2022.

Go 1.23 bao gồm hỗ trợ xem trước cho generic type alias. Xây dựng toolchain với GOEXPERIMENT=aliastypeparams kích hoạt tính năng này trong một gói. (Sử dụng generic alias type qua ranh giới gói chưa được hỗ trợ.)

Công cụ

Telemetry

Từ Go 1.23, toolchain Go có thể thu thập thống kê sử dụng và lỗi giúp nhóm Go hiểu cách toolchain Go được sử dụng và hoạt động như thế nào. Chúng tôi gọi những thống kê này là Go telemetry.

Go telemetry là hệ thống opt-in, được kiểm soát bởi lệnh go telemetry. Theo mặc định, các chương trình toolchain thu thập thống kê trong các tệp đếm có thể kiểm tra cục bộ nhưng không được sử dụng theo cách khác (go telemetry local).

Để giúp chúng tôi giữ cho Go hoạt động tốt và hiểu cách sử dụng Go, hãy cân nhắc tham gia Go telemetry bằng cách chạy go telemetry on. Trong chế độ đó, các báo cáo đếm ẩn danh được tải lên telemetry.go.dev hàng tuần, nơi chúng được tổng hợp thành các biểu đồ và cũng được cung cấp để tải xuống bởi bất kỳ người đóng góp hoặc người dùng Go nào muốn phân tích dữ liệu. Xem “Go Telemetry” để biết thêm chi tiết về hệ thống Go Telemetry.

Lệnh Go

Đặt biến môi trường GOROOT_FINAL không còn có tác dụng gì (#62047). Các bản phân phối cài đặt lệnh go ở vị trí khác với $GOROOT/bin/go nên cài đặt symlink thay vì di chuyển hoặc sao chép tệp nhị phân go.

Cờ mới go env -changed khiến lệnh chỉ in những cài đặt có giá trị hiệu lực khác với giá trị mặc định sẽ có trong môi trường trống không có lần sử dụng cờ -w trước đó.

Cờ mới go mod tidy -diff khiến lệnh không sửa đổi các tệp mà thay vào đó in các thay đổi cần thiết dưới dạng unified diff. Nó thoát với mã khác không nếu cần cập nhật.

Lệnh go list -m -json giờ bao gồm các trường SumGoModSum mới. Điều này tương tự với hành vi hiện có của lệnh go mod download -json.

Directive mới godebug trong go.modgo.work khai báo một cài đặt GODEBUG áp dụng cho work module hoặc workspace đang dùng.

Vet

Lệnh con go vet giờ bao gồm trình phân tích stdversion, đánh dấu các tham chiếu đến các symbol quá mới đối với phiên bản Go có hiệu lực trong tệp tham chiếu. (Phiên bản hiệu lực được xác định bởi directive go trong tệp go.mod bao quanh của tệp, và bởi bất kỳ ràng buộc //go:build nào trong tệp.)

Ví dụ, nó sẽ báo cáo chẩn đoán cho tham chiếu đến hàm reflect.TypeFor (được giới thiệu trong go1.22) từ một tệp trong module có tệp go.mod chỉ định go 1.21.

Cgo

cmd/cgo hỗ trợ cờ mới -ldflags để truyền cờ cho linker C. Lệnh go sử dụng nó tự động, tránh lỗi “argument list too long” với CGO_LDFLAGS rất lớn.

Trace

Công cụ trace giờ xử lý tốt hơn các trace bị hỏng một phần bằng cách cố gắng khôi phục dữ liệu trace có thể. Chức năng này đặc biệt hữu ích khi xem trace được thu thập trong quá trình chương trình bị crash, vì dữ liệu trace dẫn đến crash giờ sẽ có thể khôi phục được trong hầu hết các trường hợp.

Runtime

Traceback được in bởi runtime sau một panic không được xử lý hoặc lỗi nghiêm trọng khác giờ thụt lề các dòng thứ hai và tiếp theo của thông báo lỗi (ví dụ, đối số của panic) bằng một tab duy nhất, để nó có thể được phân biệt rõ ràng với stack trace của goroutine đầu tiên. Xem #64590 để thảo luận.

Trình biên dịch

Chi phí thời gian build khi build với tối ưu hóa dựa trên hồ sơ thực thi đã giảm đáng kể. Trước đây, các build lớn có thể thấy tăng thời gian build hơn 100% khi bật PGO. Trong Go 1.23, chi phí chỉ còn ở mức phần trăm đơn.

Trình biên dịch trong Go 1.23 giờ có thể chồng chéo các slot stack frame của các biến cục bộ được truy cập trong các vùng tách biệt của hàm, điều này giảm sử dụng stack cho các ứng dụng Go.

Với 386 và amd64, trình biên dịch sẽ sử dụng thông tin từ PGO để căn chỉnh một số block nóng trong vòng lặp. Điều này cải thiện hiệu suất thêm 1-1.5% với chi phí tăng thêm 0.1% kích thước text và binary. Hiện tại điều này chỉ được triển khai trên 386 và amd64 vì nó không cho thấy cải thiện trên các nền tảng khác. Việc căn chỉnh block nóng có thể bị vô hiệu hóa với -gcflags=[<packages>=]-d=alignhot=0.

Linker

Linker giờ không cho phép sử dụng directive //go:linkname để tham chiếu đến các symbol nội bộ trong thư viện chuẩn (bao gồm runtime) không được đánh dấu với //go:linkname trên định nghĩa của chúng. Tương tự, linker không cho phép tham chiếu đến các symbol như vậy từ mã assembly. Để tương thích ngược, các cách dùng //go:linkname hiện có được tìm thấy trong kho lưu trữ mã nguồn mở lớn vẫn được hỗ trợ. Bất kỳ tham chiếu mới nào đến các symbol nội bộ thư viện chuẩn sẽ không được cho phép.

Cờ dòng lệnh linker -checklinkname=0 có thể được dùng để vô hiệu hóa kiểm tra này, cho mục đích debugging và thử nghiệm.

Khi xây dựng tệp nhị phân ELF liên kết động (bao gồm tệp nhị phân PIE), cờ mới -bindnow kích hoạt liên kết hàm ngay lập tức.

Thư viện chuẩn

Thay đổi Timer

Go 1.23 thực hiện hai thay đổi đáng kể đối với triển khai của time.Timertime.Ticker.

Thứ nhất, các TimerTicker không còn được chương trình tham chiếu đủ điều kiện thu gom rác ngay lập tức, ngay cả khi phương thức Stop của chúng chưa được gọi. Các phiên bản Go trước không thu thập các Timer chưa dừng cho đến khi chúng đã kích hoạt và không bao giờ thu thập các Ticker chưa dừng.

Thứ hai, channel timer liên quan đến Timer hoặc Ticker giờ không có bộ đệm, với dung lượng 0. Hiệu ứng chính của thay đổi này là Go giờ đảm bảo rằng với bất kỳ lệnh gọi nào đến phương thức Reset hoặc Stop, không có giá trị cũ được chuẩn bị trước lệnh gọi đó sẽ được gửi hoặc nhận sau lệnh gọi. Các phiên bản Go trước sử dụng channel với bộ đệm một phần tử, khiến việc sử dụng ResetStop đúng cách trở nên khó khăn. Hiệu ứng có thể thấy của thay đổi này là lencap của timer channel giờ trả về 0 thay vì 1, điều này có thể ảnh hưởng đến các chương trình thăm dò độ dài để quyết định liệu việc nhận trên timer channel có thành công không. Mã như vậy nên dùng receive không chặn thay thế.

Các hành vi mới này chỉ được kích hoạt khi chương trình Go chính nằm trong module có dòng go trong go.mod sử dụng Go 1.23.0 trở lên. Khi Go 1.23 build các chương trình cũ, các hành vi cũ vẫn có hiệu lực. Cài đặt GODEBUG mới asynctimerchan=1 có thể được dùng để quay lại hành vi channel không đồng bộ ngay cả khi chương trình khai báo Go 1.23.0 trở lên trong tệp go.mod.

Gói unique mới

Gói mới unique cung cấp các tiện ích để chuẩn hóa các giá trị (như “interning” hay “hash-consing”).

Bất kỳ giá trị nào thuộc kiểu có thể so sánh đều có thể được chuẩn hóa với hàm mới Make[T], tạo ra tham chiếu đến bản sao chuẩn của giá trị dưới dạng Handle[T]. Hai Handle[T] bằng nhau khi và chỉ khi các giá trị được dùng để tạo ra các handle bằng nhau, cho phép các chương trình loại bỏ trùng lặp giá trị và giảm kích thước bộ nhớ. So sánh hai giá trị Handle[T] rất hiệu quả, quy về so sánh con trỏ đơn giản.

Các iterator

Gói mới iter cung cấp các định nghĩa cơ bản để làm việc với các iterator do người dùng định nghĩa.

Gói slices thêm một số hàm hoạt động với iterator:

  • All trả về iterator qua các chỉ số và giá trị của slice.
  • Values trả về iterator qua các phần tử của slice.
  • Backward trả về iterator lặp qua slice theo chiều ngược.
  • Collect thu thập giá trị từ iterator vào slice mới.
  • AppendSeq thêm giá trị từ iterator vào slice hiện có.
  • Sorted thu thập giá trị từ iterator vào slice mới, rồi sắp xếp slice.
  • SortedFunc giống Sorted nhưng với hàm so sánh.
  • SortedStableFunc giống SortFunc nhưng sử dụng thuật toán sắp xếp ổn định.
  • Chunk trả về iterator qua các sub-slice liên tiếp tối đa n phần tử của slice.

Gói maps thêm một số hàm hoạt động với iterator:

  • All trả về iterator qua các cặp key-value từ map.
  • Keys trả về iterator qua các key trong map.
  • Values trả về iterator qua các value trong map.
  • Insert thêm các cặp key-value từ iterator vào map hiện có.
  • Collect thu thập các cặp key-value từ iterator vào map mới và trả về nó.

Gói structs mới

Gói mới structs cung cấp các kiểu cho các trường struct sửa đổi thuộc tính của kiểu struct chứa chúng như bố cục bộ nhớ.

Trong bản phát hành này, kiểu duy nhất như vậy là HostLayout cho biết rằng một struct có trường thuộc kiểu đó có bố cục tuân theo kỳ vọng của nền tảng host. HostLayout nên được dùng trong các kiểu được truyền vào, trả về từ, hoặc được truy cập qua con trỏ truyền vào/từ API host. Nếu không có marker này, thứ tự bố cục struct không được đảm bảo bởi đặc tả ngôn ngữ, mặc dù kể từ Go 1.23 bố cục host và ngôn ngữ tình cờ khớp nhau.

Thay đổi nhỏ trong thư viện

archive/tar

Nếu đối số của FileInfoHeader triển khai interface mới FileInfoNames, thì các phương thức interface sẽ được dùng để đặt Uname/Gname của header tệp. Điều này cho phép ứng dụng ghi đè tra cứu Uname/Gname phụ thuộc hệ thống.

crypto/tls

Client TLS giờ hỗ trợ đặc tả nháp Encrypted Client Hello. Tính năng này có thể được bật bằng cách đặt trường Config.EncryptedClientHelloConfigList thành ECHConfigList được mã hóa cho host đang kết nối.

Kiểu QUICConn được dùng bởi các triển khai QUIC bao gồm các sự kiện mới báo cáo về trạng thái tiếp tục session, và cung cấp cách cho tầng QUIC thêm dữ liệu vào các ticket session và mục cache session.

Các bộ mã hóa 3DES đã bị xóa khỏi danh sách mặc định được dùng khi Config.CipherSuites là nil. Giá trị mặc định có thể được khôi phục bằng cách thêm tls3des=1 vào biến môi trường GODEBUG.

Cơ chế trao đổi khóa hậu lượng tử thử nghiệm X25519Kyber768Draft00 giờ được bật theo mặc định khi Config.CurvePreferences là nil. Giá trị mặc định có thể được khôi phục bằng cách thêm tlskyber=0 vào biến môi trường GODEBUG. Điều này có thể hữu ích khi xử lý các TLS server có lỗi không xử lý các bản ghi lớn đúng cách, gây ra timeout trong quá trình bắt tay (xem TLS post-quantum TL;DR fail).

Go 1.23 đã thay đổi hành vi của X509KeyPairLoadX509KeyPair để điền trường Certificate.Leaf của Certificate được trả về. Cài đặt GODEBUG mới x509keypairleaf được thêm cho hành vi này.

crypto/x509

CreateCertificateRequest giờ hỗ trợ đúng cách các thuật toán chữ ký RSA-PSS.

CreateCertificateRequestCreateRevocationList giờ xác minh chữ ký được tạo ra bằng khóa công khai của người ký. Nếu chữ ký không hợp lệ, một lỗi được trả về. Đây là hành vi của CreateCertificate từ Go 1.16.

Cài đặt GODEBUG x509sha1 sẽ bị xóa trong bản phát hành lớn tiếp theo (Go 1.24). Điều này có nghĩa là crypto/x509 sẽ không còn hỗ trợ xác minh chữ ký trên các chứng chỉ sử dụng các thuật toán chữ ký dựa trên SHA-1.

Hàm mới ParseOID phân tích chuỗi Object Identifier ASN.1 được mã hóa dạng chấm. Kiểu OID giờ triển khai các interface encoding.BinaryMarshaler, encoding.BinaryUnmarshaler, encoding.TextMarshaler, encoding.TextUnmarshaler.

database/sql

Các lỗi được trả về bởi các triển khai driver.Valuer giờ được wrap để cải thiện xử lý lỗi trong các thao tác như DB.Query, DB.Exec, và DB.QueryRow.

debug/elf

Gói debug/elf giờ định nghĩa PT_OPENBSD_NOBTCFI. ProgType này được dùng để vô hiệu hóa Branch Tracking Control Flow Integrity (BTCFI) trên các tệp nhị phân OpenBSD.

Giờ định nghĩa các hằng số kiểu symbol STT_RELC, STT_SRELC, và STT_GNU_IFUNC.

encoding/binary

Các hàm mới EncodeDecode là các phiên bản tương đương byte slice của ReadWrite. Append cho phép marshaling nhiều dữ liệu vào cùng một byte slice.

go/ast

Hàm mới Preorder trả về iterator thuận tiện qua tất cả các node của cây cú pháp.

go/types

Kiểu Func, đại diện cho symbol hàm hoặc phương thức, giờ có phương thức Func.Signature trả về kiểu của hàm, luôn là Signature.

Kiểu Alias giờ có phương thức Rhs trả về kiểu ở bên phải của khai báo của nó: với type A = B, Rhs của A là B. (#66559)

Các phương thức Alias.Origin, Alias.SetTypeParams, Alias.TypeParams, và Alias.TypeArgs đã được thêm. Chúng cần thiết cho generic alias type.

Theo mặc định, go/types giờ tạo ra các node kiểu Alias cho type alias. Hành vi này có thể được kiểm soát bởi cờ GODEBUG gotypesalias. Giá trị mặc định của nó đã thay đổi từ 0 trong Go 1.22 thành 1 trong Go 1.23.

math/rand/v2

Hàm Uint và phương thức Rand.Uint đã được thêm. Chúng bị thiếu sót ngoài ý muốn trong Go 1.22.

Phương thức mới ChaCha8.Read triển khai interface io.Reader.

net

Kiểu mới KeepAliveConfig cho phép tinh chỉnh các tùy chọn keep-alive cho kết nối TCP, thông qua phương thức mới TCPConn.SetKeepAliveConfig và các trường KeepAliveConfig mới cho DialerListenConfig.

Kiểu DNSError giờ wrap các lỗi do timeout hoặc hủy. Ví dụ, errors.Is(someDNSErr, context.DeadlineExceedeed) giờ sẽ báo cáo liệu lỗi DNS có do timeout không.

Cài đặt GODEBUG mới netedns0=0 vô hiệu hóa việc gửi các header bổ sung EDNS0 trên các yêu cầu DNS, vì chúng được báo cáo là làm hỏng DNS server trên một số modem.

net/http

Cookie giờ bảo toàn dấu ngoặc kép bao quanh giá trị cookie. Trường mới Cookie.Quoted cho biết liệu Cookie.Value có được đặt trong dấu ngoặc kép ban đầu không.

Phương thức mới Request.CookiesNamed lấy tất cả các cookie khớp với tên đã cho.

Trường mới Cookie.Partitioned xác định các cookie có thuộc tính Partitioned.

Các mẫu được dùng bởi ServeMux giờ cho phép một hoặc nhiều khoảng trắng hoặc tab sau tên phương thức. Trước đây, chỉ có một khoảng trắng duy nhất được cho phép.

Hàm mới ParseCookie phân tích giá trị header Cookie và trả về tất cả các cookie được đặt trong đó. Vì cùng tên cookie có thể xuất hiện nhiều lần, Values trả về có thể chứa nhiều hơn một giá trị cho một key nhất định.

Hàm mới ParseSetCookie phân tích giá trị header Set-Cookie và trả về một cookie. Nó trả về lỗi khi có lỗi cú pháp.

ServeContent, ServeFile, và ServeFileFS giờ xóa các header Cache-Control, Content-Encoding, Etag, và Last-Modified khi phục vụ lỗi. Các header này thường áp dụng cho nội dung không có lỗi, nhưng không áp dụng cho văn bản lỗi.

Middleware wrap ResponseWriter và áp dụng mã hóa ngay lập tức, chẳng hạn Content-Encoding: gzip, sẽ không hoạt động sau thay đổi này. Hành vi cũ của ServeContent, ServeFile, và ServeFileFS có thể được khôi phục bằng cách đặt GODEBUG=httpservecontentkeepheaders=1.

Lưu ý rằng middleware thay đổi kích thước nội dung được phục vụ (chẳng hạn bằng cách nén) đã không hoạt động đúng khi ServeContent xử lý yêu cầu Range. Nén ngay lập tức nên dùng header Transfer-Encoding thay vì Content-Encoding.

Đối với các yêu cầu đến, trường mới Request.Pattern chứa mẫu ServeMux (nếu có) khớp với yêu cầu. Trường này không được đặt khi GODEBUG=httpmuxgo121=1 được đặt.

net/http/httptest

Phương thức mới NewRequestWithContext tạo một yêu cầu đến với context.Context.

net/netip

Trong Go 1.22 và trước đó, việc dùng reflect.DeepEqual để so sánh một Addr chứa địa chỉ IPv4 với một addr chứa dạng IPv4-mapped IPv6 của địa chỉ đó trả về đúng không chính xác, mặc dù các giá trị Addr khác nhau khi so sánh với == hoặc Addr.Compare. Lỗi này giờ đã được sửa và cả ba cách tiếp cận đều báo cáo cùng kết quả.

os

Hàm Stat giờ đặt bit ModeSocket cho các tệp là Unix socket trên Windows. Các tệp này được xác định bằng cách có reparse tag được đặt thành IO_REPARSE_TAG_AF_UNIX.

Trên Windows, các bit mode được báo cáo bởi LstatStat cho các reparse point đã thay đổi. Mount point không còn có ModeSymlink được đặt, và các reparse point không phải symlink, Unix socket, hoặc dedup file giờ luôn có ModeIrregular được đặt. Hành vi này được kiểm soát bởi cài đặt winsymlink. Đối với Go 1.23, nó mặc định là winsymlink=1. Các phiên bản trước mặc định là winsymlink=0.

Hàm CopyFS sao chép một io/fs.FS vào hệ thống tệp cục bộ.

Trên Windows, Readlink không còn cố gắng chuẩn hóa các volume thành ký tự ổ đĩa, điều này không phải lúc nào cũng có thể. Hành vi này được kiểm soát bởi cài đặt winreadlinkvolume. Đối với Go 1.23, nó mặc định là winreadlinkvolume=1. Các phiên bản trước mặc định là winreadlinkvolume=0.

Trên Linux với hỗ trợ pidfd (thường là Linux v5.4+), các hàm và phương thức liên quan đến Process sử dụng pidfd (thay vì PID) nội bộ, loại bỏ khả năng nhắm mục tiêu sai khi PID được OS tái sử dụng. Hỗ trợ pidfd hoàn toàn trong suốt với người dùng, ngoại trừ các file descriptor tiến trình bổ sung mà tiến trình có thể có.

path/filepath

Hàm mới Localize chuyển đổi an toàn một đường dẫn được phân cách bằng dấu gạch chéo thành đường dẫn hệ điều hành.

Trên Windows, EvalSymlinks không còn đánh giá các mount point, đây là nguồn gốc của nhiều sự không nhất quán và lỗi. Hành vi này được kiểm soát bởi cài đặt winsymlink. Đối với Go 1.23, nó mặc định là winsymlink=1. Các phiên bản trước mặc định là winsymlink=0.

Trên Windows, EvalSymlinks không còn cố gắng chuẩn hóa các volume thành ký tự ổ đĩa, điều này không phải lúc nào cũng có thể. Hành vi này được kiểm soát bởi cài đặt winreadlinkvolume. Đối với Go 1.23, nó mặc định là winreadlinkvolume=1. Các phiên bản trước mặc định là winreadlinkvolume=0.

reflect

Các phương thức mới đồng nghĩa với các phương thức cùng tên trong Value được thêm vào Type:

  1. Type.OverflowComplex
  2. Type.OverflowFloat
  3. Type.OverflowInt
  4. Type.OverflowUint

Hàm mới SliceAt tương tự với NewAt, nhưng cho slice.

Các phương thức Value.PointerValue.UnsafePointer giờ hỗ trợ các giá trị thuộc loại String.

Các phương thức mới Value.SeqValue.Seq2 trả về các chuỗi lặp qua giá trị như thể nó được dùng trong vòng lặp for/range. Các phương thức mới Type.CanSeqType.CanSeq2 báo cáo liệu việc gọi Value.SeqValue.Seq2, tương ứng, có thành công mà không panic không.

runtime/debug

Hàm SetCrashOutput cho phép người dùng chỉ định một tệp thay thế mà runtime nên ghi báo cáo crash nghiêm trọng của nó. Nó có thể được dùng để xây dựng cơ chế báo cáo tự động cho tất cả các crash không mong đợi, không chỉ những crash trong goroutine dùng recover tường minh.

runtime/pprof

Độ sâu stack tối đa cho các profile alloc, mutex, block, threadcreategoroutine đã được tăng từ 32 lên 128 frame.

runtime/trace

Runtime giờ xả dữ liệu trace một cách tường minh khi chương trình crash do panic không bị bắt. Điều này có nghĩa là dữ liệu trace đầy đủ hơn sẽ có sẵn trong trace nếu chương trình crash trong khi đang trace.

slices

Hàm Repeat trả về slice mới lặp lại slice đã cung cấp số lần đã cho.

sync

Phương thức Map.Clear xóa tất cả các mục, tạo ra Map rỗng. Nó tương tự với clear.

sync/atomic

Các toán tử mới AndOr áp dụng AND hoặc OR theo bit vào đầu vào đã cho, trả về giá trị cũ.

syscall

Gói syscall giờ định nghĩa WSAENOPROTOOPT trên Windows.

Hàm GetsockoptInt giờ được hỗ trợ trên Windows.

testing/fstest

TestFS giờ trả về lỗi có cấu trúc có thể được unwrap (qua phương thức Unwrap() []error). Điều này cho phép kiểm tra lỗi bằng errors.Is hoặc errors.As.

text/template

Các template giờ hỗ trợ hành động mới “else with”, giúp giảm độ phức tạp của template trong một số trường hợp sử dụng.

time

ParseParseInLocation giờ trả về lỗi nếu offset múi giờ nằm ngoài phạm vi.

Trên Windows, Timer, Ticker, và các hàm đưa goroutine vào trạng thái ngủ, như Sleep, đã được cải thiện độ phân giải thời gian lên 0.5ms thay vì 15.6ms.

unicode/utf16

Hàm RuneLen trả về số lượng từ 16-bit trong mã hóa UTF-16 của rune. Nó trả về -1 nếu rune không phải là giá trị hợp lệ để mã hóa trong UTF-16.

Các cổng

Darwin

Như đã thông báo trong ghi chú phát hành Go 1.22, Go 1.23 yêu cầu macOS 11 Big Sur trở lên; hỗ trợ cho các phiên bản trước đã bị ngừng.

Linux

Go 1.23 là bản phát hành cuối cùng yêu cầu phiên bản kernel Linux 2.6.32 trở lên. Go 1.24 sẽ yêu cầu phiên bản kernel Linux 3.2 trở lên.

OpenBSD

Go 1.23 thêm hỗ trợ thử nghiệm cho OpenBSD trên RISC-V 64-bit (GOOS=openbsd, GOARCH=riscv64).

ARM64

Go 1.23 giới thiệu biến môi trường mới GOARM64, chỉ định phiên bản mục tiêu tối thiểu của kiến trúc ARM64 tại thời điểm biên dịch. Các giá trị được phép là v8.{0-9}v9.{0-5}. Điều này có thể được theo sau bởi một tùy chọn chỉ định các extension được triển khai bởi phần cứng mục tiêu. Các tùy chọn hợp lệ là ,lse,crypto.

Biến môi trường GOARM64 mặc định là v8.0.

RISC-V

Go 1.23 giới thiệu biến môi trường mới GORISCV64, chọn hồ sơ ứng dụng người dùng RISC-V để biên dịch. Các giá trị được phép là rva20u64rva22u64.

Biến môi trường GORISCV64 mặc định là rva20u64.

Wasm

Script go_wasip1_wasm_exec trong GOROOT/misc/wasm đã ngừng hỗ trợ các phiên bản wasmtime < 14.0.0.