Ghi chú bản phát hành Go 1.27

Giới thiệu về Go 1.27

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

Thay đổi đối với ngôn ngữ

Go 1.27 hiện hỗ trợ phương thức generic: một khai báo phương thức có thể khai báo riêng các tham số kiểu của nó. Thay đổi được mong đợi rộng rãi này cho phép thêm các hàm generic trong không gian tên của một kiểu dữ liệu cụ thể, trong khi trước đây phải khai báo các hàm như vậy với phạm vi của toàn bộ gói. Ví dụ, math/rand/v2 hiện cũng khai báo một phương thức generic với chữ ký (*Rand) N[Int intType](Int) Int, trong khi trước đây nó chỉ có một hàm generic N[Int intType](Int) Int (xem bên dưới để biết chi tiết). Lưu ý rằng các phương thức của interface không được khai báo tham số kiểu và các phương thức interface cũng không thể được triển khai bằng các phương thức generic.

Một khóa trong struct literal giờ đây có thể là bất kỳ trình chọn trường hợp lệ nào cho kiểu struct, không chỉ là tên trường (cấp cao nhất) của struct.

Suy luận kiểu hàm đã được tổng quát hóa để áp dụng trong mọi ngữ cảnh mà một hàm generic được gán cho một biến có kiểu hàm tương ứng (hoặc được chuyển đổi thành kiểu hàm tương ứng).

Công cụ

Việc phân tích cú pháp tệp phản hồi (@file) hiện được hỗ trợ cho các công cụ compile, link, asm, cgo, coverpack. Tệp phản hồi chứa các đối số được phân tách bằng khoảng trắng, hỗ trợ chuỗi được đặt trong dấu nháy đơn và dấu nháy kép, chuỗi thoát và tiếp nối dòng bằng dấu gạch chéo ngược-dòng mới. Định dạng này tương thích với triển khai tệp phản hồi của GCC để đảm bảo khả năng tương tác với các hệ thống build hiện có.

Lệnh Go

Lệnh go không còn hỗ trợ hệ thống quản lý phiên bản bzr. Lệnh này sẽ không còn có thể trực tiếp tải các module được lưu trữ trên các máy chủ bzr.

GODEBUG

Bắt đầu từ Go 1.27, lệnh go nhận dạng một thiết lập GODEBUG mà phần hỗ trợ đã bị gỡ bỏ (chẳng hạn như asynctimerchan, xem bên dưới) nếu thiết lập này xuất hiện trong các tệp go.mod (các mục godebug) và các tệp mã nguồn .go (các chú thích //go:debug). Lệnh này chấp nhận các thiết lập đó nếu chúng được đặt thành giá trị mặc định cuối cùng được xác lập trước khi thiết lập bị gỡ bỏ. Nếu chúng được đặt thành một giá trị cũ, lệnh go sẽ thất bại. Thay đổi này phù hợp với tinh thần của cam kết tương thích Go 1 và cho phép các chương trình hiện có đặt các thiết lập GODEBUG được hỗ trợ tiếp tục xây dựng và chạy mà không cần thay đổi ngay cả khi phần hỗ trợ cho thiết lập tương ứng đã bị gỡ bỏ.

go test

go test giờ đây gọi kiểm tra vet stdversion theo mặc định. Kiểm tra này báo cáo việc sử dụng các ký hiệu trong thư viện chuẩn quá mới so với phiên bản Go đang được áp dụng trong tệp tham chiếu, được xác định bởi chỉ thị go trong go.mod và các thẻ xây dựng trên tệp đó.

go test -json giờ đây chú thích các dòng "Action":"output" bằng một trường mới tùy chọn "OutputType", chỉ định kiểu đầu ra. Hiện tại, các giá trị có thể có bao gồm “error”, “error-continue” và “frame”. Xem trợ giúp cmd/test2json để biết chi tiết.

go doc

Lệnh go doc giờ đây hỗ trợ cú pháp package@version, chẳng hạn như go doc example.com/[email protected].

Lệnh go doc giờ đây chấp nhận tùy chọn dòng lệnh -ex để liệt kê các ví dụ có thể thực thi của gói hoặc ký hiệu đã cho. Khi tên ví dụ được truyền trên dòng lệnh (chẳng hạn như go doc bytes.ExampleBuffer), go doc giờ đây in mã nguồn của ví dụ cùng với các chú thích.

go fix

Lệnh go fix chứa một số công cụ hiện đại hóa mới (atomictypes, embedlit, slicesbackwardunsafefuncs).

Trình phân tích fmtappendf hiện có đã bị gỡ bỏ do các mối quan ngại về phong cách.

Trình phân tích waitgroup hiện có đã được đổi tên thành waitgroupgo để tránh nhầm lẫn.

go mod tidy

Đối với các module chỉ định go 1.27 trở lên trong tệp go.mod, go mod tidy giờ đây tự động hợp nhất các khối require trùng lặp. Điều này đảm bảo tệp duy trì cấu trúc chuẩn, gọn gàng, chứa nhiều nhất hai khối require: một khối cho dependency trực tiếp và một khối cho dependency gián tiếp.

Các khối chú thích hiện có được gắn với dependency được bảo toàn trong quá trình hợp nhất này. Nếu một khối chú thích được liên kết với một tập chỉ thị hỗn hợp (chứa cả dependency trực tiếp và gián tiếp), khối chú thích sẽ được hợp nhất và gắn vào khối dependency trực tiếp mới.

Trước đây, nếu tệp go.mod tích lũy nhiều khối require rời rạc (thường do chỉnh sửa thủ công, xung đột hợp nhất Git chưa được giải quyết hoặc nâng cấp cũ), go mod tidy sẽ giữ nguyên các khối thừa hoặc vô tình tạo thêm các khối mới. Công cụ này giờ đây thực thi nghiêm ngặt bố cục hai khối, hợp nhất các yêu cầu khác nhau vào các khối tương ứng và tự động dọn dẹp cấu trúc của tệp module.

Trace

Tùy chọn dòng lệnh -http của go tool trace giờ đây giới hạn địa chỉ lắng nghe ở localhost khi chỉ được truyền một cổng (ví dụ: -http=:6060). Thay đổi này giúp go tool trace nhất quán với hành vi của cờ -http của go tool pprof.
Để lắng nghe trên tất cả địa chỉ, hãy chỉ định rõ địa chỉ được yêu cầu (ví dụ: -http=0.0.0.0:6060).

Runtime

Dấu vết ngăn xếp cho các module có chỉ thị go cấu hình Go 1.27 trở lên giờ đây sẽ bao gồm nhãn goroutine của runtime/pprof trong dòng tiêu đề. Hành vi này có thể được vô hiệu hóa bằng thiết lập tracebacklabels=0 GODEBUG (được thêm trong Go 1.26). Tùy chọn loại bỏ này dự kiến sẽ được giữ vô thời hạn trong trường hợp nhãn goroutine thu thập thông tin nhạy cảm không nên được cung cấp trong dấu vết ngăn xếp.

Thiết lập asynctimerchan GODEBUG (được thêm trong Go 1.23) đã bị xóa vĩnh viễn. Các channel được tạo bởi package time giờ đây luôn không có bộ đệm (đồng bộ), bất kể các thiết lập GODEBUG.

Cấp phát bộ nhớ nhanh hơn

Trình biên dịch hiện tạo ra các lệnh gọi đến các thường trình cấp phát bộ nhớ chuyên biệt theo kích thước, giúp giảm chi phí của một số lần cấp phát bộ nhớ nhỏ (<80 byte) lên đến 30%. Các cải tiến khác nhau tùy thuộc vào khối lượng công việc, nhưng mức cải thiện tổng thể được kỳ vọng là ~1% trong các chương trình thực tế có nhiều hoạt động cấp phát. Điều này khiến kích thước binary tăng khoảng 60 KB (không phụ thuộc vào khối lượng công việc). Vui lòng tạo issue nếu bạn nhận thấy bất kỳ hồi quy nào. Bạn có thể đặt GOEXPERIMENT=nosizespecializedmalloc tại thời điểm build để vô hiệu hóa tính năng này. Thiết lập opt-out này dự kiến sẽ bị xóa trong Go 1.28.

Hồ sơ rò rỉ goroutine

Một kiểu hồ sơ mới báo cáo các goroutine bị rò rỉ, trước đây có sẵn dưới dạng một thử nghiệm trong Go 1.26, hiện đã được cung cấp rộng rãi. Kiểu hồ sơ mới, có tên là goroutineleak, được hỗ trợ trong gói runtime/pprof. Nó cũng có sẵn dưới dạng endpoint net/http/pprof /debug/pprof/goroutineleak.

Một goroutine bị rò rỉ là một goroutine bị chặn trên một nguyên thủy đồng thời nào đó (channel, sync.Mutex, sync.Cond, v.v.) mà không thể nào được bỏ chặn. Runtime phát hiện các goroutine bị rò rỉ bằng cách sử dụng bộ gom rác: nếu một goroutine G bị chặn trên nguyên thủy đồng thời P, và P không thể truy cập được từ bất kỳ goroutine nào có thể chạy hoặc bất kỳ goroutine nào mà các goroutine đó có thể bỏ chặn, thì P không thể được bỏ chặn, vì vậy goroutine G sẽ không bao giờ thức dậy. Mặc dù không thể phát hiện các goroutine bị chặn vĩnh viễn trong mọi trường hợp, cách tiếp cận này phát hiện được một lớp lớn các kiểu rò rỉ như vậy.

Vì kỹ thuật này dựa trên khả năng truy cập, runtime có thể không xác định được các rò rỉ gây ra bởi việc chặn trên các nguyên thủy đồng thời có thể truy cập thông qua các biến toàn cục hoặc các biến cục bộ của các goroutine có thể chạy.

Xem ghi chú bản phát hành Go 1.26 để biết một ví dụ.

Đặc biệt cảm ơn Vlad Saioc tại Uber vì đã đóng góp công việc này.

Thiết lập goroutineleakprofile GOEXPERIMENT hiện đã bị xóa.

Compiler

Trình biên dịch hiện giải quyết tên tệp tương đối trong chỉ thị //line hoặc /*line*/ dựa trên thư mục của tệp chứa chỉ thị đó, phù hợp với hành vi của go/scanner. Các tên tệp tuyệt đối không bị ảnh hưởng. Xem #70478.

Trình biên dịch hiện tạo các tên đơn giản hơn cho các hàm literal (closure). Trước đây, khi hàm chứa nó được inline, tên của hàm literal có thể trở nên rất dài. Giờ đây trình biên dịch chọn cùng một tên cho hàm literal bất kể có inline hay không. Nó cũng có thể kết hợp nhiều thể hiện của cùng một hàm literal (khi hàm chứa nó được inline) để chia sẻ cùng một mã trong binary đã biên dịch. Thay đổi này không ảnh hưởng đến chức năng của mã Go. Các bài kiểm tra kiểm tra tên symbol có thể cần được cập nhật, mặc dù khuyến nghị không phụ thuộc vào tên của các hàm literal. Đối với các chương trình so sánh không chính xác con trỏ mã hàm để kiểm tra tính bằng nhau, vấn đề có thể dễ lộ rõ hơn với Go 1.27, vì các hàm literal với dữ liệu closure được capture khác nhau có thể có con trỏ mã bằng nhau trong nhiều trường hợp hơn.

Linker

Khi nhắm mục tiêu macOS, linker hiện chấp nhận các tùy chọn dòng lệnh -macos-macsdk, dùng để chỉ định phiên bản OS và SDK trong lệnh tải LC_BUILD_VERSION. Theo mặc định, nó chọn phiên bản macOS cũ nhất được hỗ trợ (hiện là 13.0.0) và phiên bản SDK gần đây (hiện là 26.2.0).

Thư viện chuẩn

Các gói encoding/json/v2 và encoding/json/jsontext mới

Hiện có hai gói mới:

Gói v2 chọn các giá trị mặc định nghiêm ngặt hơn và có khả năng tương tác tốt hơn so với v1: nó từ chối UTF-8 không hợp lệ trong chuỗi JSON và từ chối các tên trùng lặp trong một đối tượng JSON. Xem tài liệu gói encoding/json v1 để biết toàn bộ tập hợp khác biệt về hành vi và các tùy chọn có sẵn để điều chỉnh chúng.

Gói encoding/json hiện được hỗ trợ bởi cài đặt v2. Hành vi marshal và unmarshal được giữ nguyên, nhưng văn bản chính xác của thông báo lỗi có thể khác. Gói này cũng có thêm một số Options mới có thể cấu hình v2 hoạt động với ngữ nghĩa v1 để tránh yêu cầu di chuyển hoàn toàn sang API mới. API v1 sẽ tiếp tục được hỗ trợ và người dùng không bắt buộc phải di chuyển.

Hiệu năng marshal nhìn chung tương đương với cài đặt trước đó, trong khi hiệu năng unmarshal nhanh hơn đáng kể.

Người dùng gặp vấn đề tương thích với cài đặt mới có thể vô hiệu hóa nó bằng cách đặt GOEXPERIMENT=nojsonv2 tại thời điểm build, khôi phục cài đặt v1 ban đầu. Tùy chọn vô hiệu hóa này dự kiến sẽ bị loại bỏ trong một bản phát hành tương lai.

Một số thay đổi đáng chú ý đối với encoding/json/v2 trong quá trình GOEXPERIMENT bao gồm các loại bỏ sau: tùy chọn tag format (#79071), tùy chọn tag unknown (#77271), tùy chọn marshal DiscardUnknownMembers (#77271), và lỗi sentinel SkipFunc (#74324). Ngoài ra, tùy chọn tag inline đã được đổi tên thành embed (#79985), và hành vi đã được cập nhật cho tùy chọn tag string (#79065) và tùy chọn MatchCaseInsensitiveNames (CL 792780). Trong encoding/json/jsontext, các bộ truy cập số của Token đã được thay đổi để cũng trả về lỗi (#77666).

Xem vấn đề đề xuất để biết thông tin nền và chi tiết bổ sung. Nếu bạn cần vô hiệu hóa cài đặt mới, vui lòng tạo một issue.

New crypto/mldsa package

The new crypto/mldsa package implements the post-quantum ML-DSA signature scheme specified in FIPS 204.

crypto/x509 now supports ML-DSA private keys, public keys, and signatures.

crypto/tls now supports ML-DSA signatures in TLS 1.3, with the new MLDSA44, MLDSA65, and MLDSA87 SignatureScheme values.

New uuid package

The new uuid package generates and parses UUIDs.

New experimental simd package

Go 1.27 introduces a new experimental simd package that provides portable and vector-size-agnostic SIMD support. It will make use of the hardware instructions if they are available. This package is enabled by setting the environment variable GOEXPERIMENT=simd at build time.

The simd package is available on all architectures, and provides vector types of unspecified size such as Int8s and Float32s. It supports a “scalable” subset of the operations present in the simd/archsimd package that are hardware-supported or easily emulated across architectures and vector widths.

See the proposal issue for more details.

Experimental simd/archsimd package

Go 1.27 continues the experimental support for SIMD operations in the simd/archsimd package that began in Go 1.26. This release revises the amd64 API and adds support for arm64 “Neon” 128-bit SIMD and WebAssembly 128-bit SIMD. The simd/archsimd package is enabled by setting the environment variable GOEXPERIMENT=simd at build time.

This package provides access to architecture-specific SIMD operations. It supports 128-bit vector types on wasm, arm64, and amd64, and 256-bit and 512-bit vector types on some amd64 processors. The API is not yet considered stable.

See the package documentation and the proposal issue for more details.

We intend to provide support for additional architectures in future versions, but the API is intentionally architecture-specific and thus non-portable.

Thay đổi nhỏ đối với thư viện

bytes

Hàm mới CutLast cắt một []byte xung quanh lần xuất hiện cuối cùng của dấu phân cách. Hàm này có thể thay thế và đơn giản hóa một số cách sử dụng phổ biến của LastIndex.

compress/flate

Tốc độ nén được cải thiện trong Go 1.27. Kết quả đầu ra đã mã hóa chính xác từ Writer có thể khác với Go 1.26 do thay đổi trong cách triển khai bộ mã hóa. Vì DEFLATE là phương thức nén nền tảng được sử dụng trong archive/zip, compress/gzip, compress/zlib, và image/png, kết quả đầu ra từ các gói đó cũng có thể đã thay đổi.

crypto

Giá trị MLDSAMu Hash mới được thêm vào để sử dụng làm cơ chế báo hiệu cho việc ký External μ ML-DSA.

crypto/ecdsa

PrivateKey.Sign hiện kiểm tra rằng độ dài của hash là chính xác, nếu một SignerOpts khác nil được cung cấp.

crypto/tls

Trường mới QUICConfig.ClientHelloInfoConn chỉ định net.Conn được sử dụng cho trường ClientHelloInfo.Conn trong quá trình bắt tay của máy chủ QUIC.

Việc trao đổi khóa MLKEM1024 hiện được hỗ trợ. Có thể bật tính năng này bằng cách thêm nó vào Config.CurvePreferences.

Config.Rand hiện đã bị loại bỏ. Để kiểm thử xác định, hãy sử dụng testing/cryptotest.SetGlobalRandom.

Các trao đổi khóa lai hậu lượng tử hiện có thể được bật rõ ràng trong Config.CurvePreferences ngay cả khi các tùy chọn tlsmlkem=0 hoặc tlssecpmlkem=0 GODEBUG được sử dụng. Những tùy chọn đó luôn chỉ được dùng để áp dụng cho tập mặc định được sử dụng khi Config.CurvePreferences là nil.

Trường mới ConnectionState.LocalCertificate chứa chuỗi chứng chỉ được trình bày cho phía đối tác kết nối trong quá trình bắt tay.

Các thiết lập GODEBUG tlsunsafeekm (được thêm trong Go 1.22), tlsrsakex (được thêm trong Go 1.22), tls3des (được thêm trong Go 1.23), tls10server (được thêm trong Go 1.22), và x509keypairleaf (được thêm trong Go 1.23) đã bị xóa vĩnh viễn.

Thiết lập GODEBUG tlskyber (được thêm trong Go 1.23) đã bị xóa trong Go 1.24 nhưng việc xóa này chưa được ghi nhận trong ghi chú phát hành cho Go 1.24 vào thời điểm đó; hiện đã được ghi nhận.

crypto/x509

Khi phân tích cú pháp vào các trường pkix.Name, hiện hỗ trợ phạm vi rộng hơn các kiểu pkix.AttributeTypeAndValue.Value, và các kiểu không xác định được sẽ được phân tích thành asn1.RawValue.

Các trường mới Certificate.RawSignatureAlgorithm, CertificateRequest.RawSignatureAlgorithm, và RevocationList.RawSignatureAlgorithm hiển thị AlgorithmIdentifier được mã hóa DER của thuật toán chữ ký, bao gồm cả khi trường SignatureAlgorithm là UnknownSignatureAlgorithm.

SystemCertPool hiện tôn trọng SSL_CERT_FILE và SSL_CERT_DIR trên Windows và Darwin. Khi các biến môi trường này được đặt, các root được tải từ đĩa và thay vì sử dụng các API xác minh chứng chỉ của nền tảng, trình xác minh Go gốc được sử dụng. Hành vi này có thể được vô hiệu hóa bằng GODEBUG=x509sslcertoverrideplatform=0.

crypto/x509/pkix

RDNSequence.String (và do đó Name.String) hiện hiển thị các giá trị thuộc tính có kiểu chuỗi dưới dạng chuỗi ngay cả khi OID của thuộc tính không được nhận dạng. Trước đây, các giá trị như vậy luôn được mã hóa thập lục phân ở dạng DER. Xem #33093.

database/sql

Hàm mới ConvertAssign cung cấp cho trình điều khiển cơ sở dữ liệu quyền truy cập vào các chuyển đổi kiểu được thực hiện bởi Rows.Scan.

database/sql/driver

Các driver có thể triển khai interface mới RowsColumnScanner để quét trực tiếp vào các đích do người dùng cung cấp.

go/constant

Hàm StringLen mới trả về độ dài của một chuỗi Value mà không cần xây dựng đầy đủ Value.

go/scanner

Scanner hiện cho phép lấy vị trí kết thúc của một token thông qua phương thức Scanner.End mới.

go/token

File hiện có phương thức String.

go/types

Kiểu Hasher là một triển khai của maphash.Hasher cho các Types tôn trọng quan hệ tương đương Identical, cho phép Types được sử dụng trong bảng băm và các cấu trúc dữ liệu tương tự. HasherIgnoreTags là hasher tương tự cho IdenticalIgnoreTags.

Thiết lập gotypesalias GODEBUG (được thêm vào trong Go 1.22) đã bị xóa vĩnh viễn và gói go/types hiện luôn tạo một nút kiểu Alias cho khai báo alias bất kể các thiết lập GODEBUG.

hash/maphash

Kiểu interface Hasher định nghĩa hợp đồng giữa các giá trị của một kiểu cụ thể và các cấu trúc dữ liệu dựa trên hash trong tương lai như bảng băm và bộ lọc Bloom; xem #70471.

Kiểu ComparableHasher cung cấp một triển khai thuận tiện của Hasher cho các kiểu có thể so sánh trong đó phương thức Equal được định nghĩa là ==.

math/big

Int hiện có phương thức Divide để tính thương và phần dư của hai giá trị Int. Phương thức này hỗ trợ các chế độ làm tròn Trunc, Floor, RoundCeil.

math/rand/v2

Rand hiện hỗ trợ phương thức generic N, phù hợp với hành vi của hàm N cấp cao nhất.

net

Các phương thức đọc của UnixConn hiện trả về trực tiếp io.EOF thay vì bọc nó trong net.OpError khi thao tác đọc bên dưới trả về EOF.

net/http

TransportServer hỗ trợ thương lượng giao thức TLS ALPN trên các kết nối net.Conn do người dùng cung cấp, triển khai phương thức ConnectionState() tls.ConnectionState.

Máy chủ HTTP/2 hiện chấp nhận các tín hiệu ưu tiên từ client, như được định nghĩa trong RFC 9218, cho phép nó ưu tiên phục vụ các stream HTTP/2 có mức ưu tiên cao hơn. Nếu muốn dùng hành vi cũ, trong đó các stream được phục vụ theo cách xoay vòng bất kể mức ưu tiên, có thể đặt Server.DisableClientPriority thành true.

Response.Body HTTP/1 hiện tự động xả mọi nội dung chưa đọc khi được đóng, lên đến một giới hạn thận trọng, để cho phép tái sử dụng kết nối tốt hơn. Với hầu hết chương trình, thay đổi này không có tác động hoặc sẽ cải thiện hiệu năng. Trong một số trường hợp hiếm, các chương trình không hưởng lợi từ việc tái sử dụng kết nối có thể gặp suy giảm hiệu năng nếu trước đây chúng cho phép một lượng lớn kết nối nhàn rỗi tồn tại không đúng cách; thường là do đặt Transport.MaxIdleConns thành 0 hoặc sử dụng các Client khác nhau cho các yêu cầu khác nhau, qua đó bỏ qua giới hạn của Transport.MaxIdleConns. Trong các trường hợp này, đặt Transport.DisableKeepAlives thành true sẽ tắt việc tái sử dụng kết nối. Tuy nhiên, suy giảm hiệu năng như vậy thường cho thấy cấu hình hoặc cách sử dụng Transport hoặc Client không phù hợp ngay từ đầu, và việc xem xét kỹ hơn có thể sẽ hữu ích.

Trường mới Server.MaxHeaderValueCount cho phép các máy chủ HTTP kiểm soát số lượng giá trị header mà chúng sẵn sàng chấp nhận. Nếu không được đặt, DefaultMaxHeaderValueCount sẽ được sử dụng.

net/http/httptest

The new NewTestServer function creates a Server configured to use an in-memory fake network suitable for use with the testing/synctest package.

net/url

The new URL.Clone method creates a deep copy of a URL. The new Values.Clone method creates a deep copy of Values.

runtime/secret

Goroutines that are created while in secret mode will now themselves execute in secret mode.

strings

The new CutLast function slices a string around the last occurrence of a separator. It can replace and simplify some common uses of LastIndex.

syscall

On Plan 9, the Errno type is now defined and implements the error interface, as on other platforms. Plan 9 system calls return ErrorString values, so Errno is never returned by this package on Plan 9. It is defined so that portable code referring to syscall.Errno builds on Plan 9 without build constraints.

testing/synctest

The new Sleep helper function combines time.Sleep and synctest.Wait.

unicode

The unicode package and associated support throughout the system have been upgraded from Unicode 15 to Unicode 17. See the Unicode 16.0.0 and Unicode 17.0.0 release notes for information about the changes.

Cổng

Darwin

Như đã thông báo trong ghi chú bản phát hành Go 1.26, Go 1.27 yêu cầu macOS 13 Ventura hoặc mới hơn; hỗ trợ cho các phiên bản trước đã bị ngừng.

PowerPC

Trên cổng PowerPC 64-bit big-endian trên Linux (GOOS=linux GOARCH=ppc64), chuỗi công cụ Go hiện tạo các binary sử dụng ABI hệ thống ELFv2. Hỗ trợ ELFv2 yêu cầu nhân Linux 3.13 hoặc mới hơn. RHEL7 đã đưa ngược hỗ trợ này vào nhân 3.10 của nó.

Cgo, các tệp thực thi độc lập vị trí (PIE), và liên kết bên ngoài hiện đã được hỗ trợ. Việc sử dụng các tính năng này yêu cầu runtime tương thích với ELFv2 (libc và tất cả thư viện được liên kết và tải).

Đối với các chương trình không sử dụng cgo, chuỗi công cụ Go vẫn tạo các binary tĩnh với liên kết nội bộ theo mặc định. Đối với các chương trình có tùy chọn cgo, nếu cần một binary tĩnh thuần Go, bạn có thể đặt biến môi trường CGO_ENABLED=0 khi chạy go build.