Ghi chú bản phát hành Go 1.25
Giới thiệu về Go 1.25
Bản phát hành Go mới nhất, phiên bản 1.25, ra mắt vào Tháng 8 năm 2025, sáu tháng sau Go 1.24. 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 vẫn duy trì cam kết 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.
Các thay đổi đối với ngôn ngữ
Không có thay đổi nào về ngôn ngữ ảnh hưởng đến các chương trình Go trong Go 1.25. Tuy nhiên, trong đặc tả ngôn ngữ, khái niệm kiểu cốt lõi đã được loại bỏ để thay thế bằng phần mô tả riêng. Xem bài đăng trên blog tương ứng để biết thêm thông tin.
Công cụ
Lệnh Go
Tùy chọn -asan của go build hiện mặc định thực hiện phát hiện rò rỉ khi chương trình kết thúc.
Tùy chọn này sẽ báo lỗi nếu bộ nhớ được C cấp phát không được giải phóng và không được tham chiếu bởi bất kỳ bộ nhớ nào khác được C hoặc Go cấp phát.
Các báo cáo lỗi mới này có thể được vô hiệu hóa bằng cách đặt ASAN_OPTIONS=detect_leaks=0 trong môi trường khi chạy chương trình.
Bản phân phối Go sẽ bao gồm ít binary công cụ được xây dựng sẵn hơn. Các binary cốt lõi của toolchain như trình biên dịch và trình liên kết vẫn sẽ được đưa vào, nhưng các công cụ không được gọi bởi các thao tác build hoặc test sẽ được xây dựng và chạy bởi go tool khi cần.
Chỉ thị ignore mới của go.mod có thể được dùng để chỉ định các thư mục mà lệnh go nên bỏ qua. Các tệp trong những thư mục này và các thư mục con của chúng sẽ bị lệnh go bỏ qua khi khớp các mẫu gói, chẳng hạn như all hoặc ./..., nhưng vẫn sẽ được đưa vào các tệp zip của module.
Tùy chọn -http mới của go doc sẽ khởi động một máy chủ tài liệu hiển thị tài liệu cho đối tượng được yêu cầu và mở tài liệu trong một cửa sổ trình duyệt.
Tùy chọn go version -m -json mới sẽ in các biểu diễn JSON của các cấu trúc runtime/debug.BuildInfo được nhúng trong các tệp binary Go được chỉ định.
Lệnh go hiện hỗ trợ sử dụng một thư mục con của một repository làm đường dẫn cho gốc module khi giải quyết đường dẫn module bằng cú pháp
<meta name="go-import" content="root-path vcs repo-url subdir"> để chỉ ra rằng root-path tương ứng với subdir của repo-url sử dụng hệ thống kiểm soát phiên bản vcs.
Mẫu gói work mới khớp với tất cả gói trong các module work (trước đây được gọi là main): hoặc module work duy nhất trong chế độ module hoặc tập hợp các module workspace trong chế độ workspace.
Khi lệnh go cập nhật dòng go trong tệp go.mod hoặc go.work, nó không còn thêm một dòng toolchain chỉ định phiên bản hiện tại của lệnh.
Vet
Lệnh go vet bao gồm các bộ phân tích mới:
- waitgroup,
báo cáo các lệnh gọi sai vị trí tới
sync.WaitGroup.Add; và
- hostport,
báo cáo việc sử dụng
fmt.Sprintf("%s:%d", host, port)để tạo địa chỉ chonet.Dial, vì các địa chỉ này sẽ không hoạt động với IPv6; thay vào đó đề xuất sử dụngnet.JoinHostPort.
Runtime
GOMAXPROCS nhận biết container
Hành vi mặc định của GOMAXPROCS đã thay đổi. Trong các phiên bản Go trước,
GOMAXPROCS mặc định là số CPU logic có sẵn khi khởi động
(runtime.NumCPU). Go 1.25 giới thiệu hai thay đổi:
-
Trên Linux, runtime xem xét giới hạn băng thông CPU của cgroup chứa tiến trình, nếu có. Nếu giới hạn băng thông CPU thấp hơn số CPU logic có sẵn,
GOMAXPROCSsẽ mặc định theo giới hạn thấp hơn đó. Trong các hệ thống runtime container như Kubernetes, giới hạn băng thông CPU của cgroup thường tương ứng với tùy chọn “CPU limit”. Runtime Go không xem xét tùy chọn “CPU requests”. -
Trên tất cả hệ điều hành, runtime định kỳ cập nhật
GOMAXPROCSnếu số CPU logic có sẵn hoặc giới hạn băng thông CPU của cgroup thay đổi.
Cả hai hành vi này được tự động vô hiệu hóa nếu GOMAXPROCS được đặt
thủ công thông qua biến môi trường GOMAXPROCS hoặc một lệnh gọi tới
runtime.GOMAXPROCS. Chúng cũng có thể được vô hiệu hóa
một cách rõ ràng bằng các thiết lập GODEBUG
containermaxprocs=0 và updatemaxprocs=0,
tương ứng.
Để hỗ trợ việc đọc các giới hạn cgroup đã được cập nhật, runtime sẽ giữ các bộ mô tả tệp đã lưu trong bộ nhớ đệm cho các tệp cgroup trong suốt vòng đời của tiến trình.
Bộ gom rác thử nghiệm mới
Một bộ gom rác mới hiện có sẵn dưới dạng thử nghiệm. Thiết kế của bộ gom rác này cải thiện hiệu năng đánh dấu và quét các đối tượng nhỏ thông qua tính cục bộ tốt hơn và khả năng mở rộng theo CPU. Kết quả benchmark thay đổi, nhưng chúng tôi kỳ vọng mức giảm chi phí thu gom rác từ 10—40% trong các chương trình thực tế sử dụng nhiều bộ gom rác.
Bộ gom rác mới có thể được bật bằng cách đặt GOEXPERIMENT=greenteagc
khi build. Chúng tôi kỳ vọng thiết kế này sẽ tiếp tục phát triển và cải thiện.
Vì mục đích đó, chúng tôi khuyến khích các nhà phát triển Go dùng thử và
phản hồi lại trải nghiệm của họ. Xem vấn đề trên GitHub để biết
thêm chi tiết về thiết kế và hướng dẫn chia sẻ phản hồi.
Trace flight recorder
Runtime execution traces từ lâu đã cung cấp một cách mạnh mẽ nhưng tốn kém để hiểu và gỡ lỗi hành vi cấp thấp của một ứng dụng. Tuy nhiên, do kích thước của chúng và chi phí liên tục ghi một execution trace, chúng thường không thực tế khi dùng để gỡ lỗi các sự kiện hiếm gặp.
API mới runtime/trace.FlightRecorder cung cấp một cách nhẹ để thu thập một runtime execution trace bằng cách liên tục ghi trace vào một ring buffer trong bộ nhớ. Khi một sự kiện quan trọng xảy ra, chương trình có thể gọi FlightRecorder.WriteTo để chụp ảnh nhanh vài giây cuối cùng của trace vào một tệp. Cách tiếp cận này tạo ra một trace nhỏ hơn nhiều bằng cách cho phép các ứng dụng chỉ thu thập những trace quan trọng.
Khoảng thời gian và lượng dữ liệu được thu thập bởi FlightRecorder có thể được cấu hình trong FlightRecorderConfig.
Thay đổi đối với đầu ra panic không được xử lý
Thông báo được in khi một chương trình thoát do một panic không được xử lý, vốn đã được recover và panic lại, không còn lặp lại nội dung của giá trị panic.
Trước đây, một chương trình panic với panic("PANIC"), recover panic đó, sau đó panic lại với giá trị ban đầu sẽ in:
panic: PANIC [recovered]
panic: PANIC
Chương trình này giờ sẽ in:
panic: PANIC [recovered, repanicked]
Tên VMA trên Linux
Trên các hệ thống Linux có kernel hỗ trợ tên vùng bộ nhớ ảo ẩn danh (VMA)
(CONFIG_ANON_VMA_NAME), runtime Go sẽ chú thích các ánh xạ bộ nhớ ẩn danh bằng ngữ cảnh về mục đích của chúng. Ví dụ: [anon: Go: heap] cho bộ nhớ heap. Có thể tắt tính năng này bằng thiết lập GODEBUG decoratemappings=0.
Trình biên dịch
Lỗi con trỏ nil
Bản phát hành này sửa một lỗi trình biên dịch, được giới thiệu trong Go 1.21, có thể trì hoãn không chính xác các kiểm tra con trỏ nil. Các chương trình như sau, vốn trước đây chạy thành công (không đúng), giờ sẽ (đúng) panic với ngoại lệ con trỏ nil:
package main
import "os"
func main() {
f, err := os.Open("nonExistentFile")
name := f.Name()
if err != nil {
return
}
println(name)
}
Chương trình này không đúng vì nó sử dụng kết quả của os.Open trước khi kiểm tra lỗi. Nếu err khác nil, thì kết quả f có thể là nil, trong trường hợp đó f.Name() sẽ panic. Tuy nhiên, trong các phiên bản Go từ 1.21 đến 1.24, trình biên dịch đã trì hoãn không chính xác việc kiểm tra nil cho đến sau khi kiểm tra lỗi, khiến chương trình chạy thành công, vi phạm đặc tả Go. Trong Go 1.25, chương trình sẽ không còn chạy thành công nữa. Nếu thay đổi này ảnh hưởng đến mã của bạn, giải pháp là đặt kiểm tra lỗi khác nil sớm hơn trong mã, tốt nhất là ngay sau câu lệnh tạo ra lỗi.
Hỗ trợ DWARF5
Trình biên dịch và trình liên kết trong Go 1.25 hiện tạo thông tin gỡ lỗi
bằng DWARF phiên bản 5. Phiên bản DWARF
mới hơn làm giảm không gian cần thiết cho thông tin gỡ lỗi trong các
binary Go, đồng thời giảm thời gian liên kết, đặc biệt đối với các
binary Go lớn.
Có thể tắt việc tạo DWARF 5 bằng cách đặt biến môi trường
GOEXPERIMENT=nodwarf5 tại thời điểm build
(fallback này có thể bị loại bỏ trong một bản phát hành Go trong tương lai).
Slice nhanh hơn
Trình biên dịch hiện có thể cấp phát vùng lưu trữ phía sau cho slice trên
stack trong nhiều trường hợp hơn, giúp cải thiện hiệu năng. Thay đổi này có
khả năng làm tăng ảnh hưởng của việc sử dụng
unsafe.Pointer không đúng, xem ví dụ issue
73199. Để tìm ra các vấn đề này, có thể sử dụng
công cụ bisect để
tìm vùng cấp phát gây ra sự cố bằng cách sử dụng cờ
-compile=variablemake. Tất cả các vùng cấp phát stack mới như vậy cũng có
thể được tắt bằng cách sử dụng -gcflags=all=-d=variablemakehash=n.
Trình liên kết
Trình liên kết hiện chấp nhận tùy chọn dòng lệnh -funcalign=N, tùy chọn này
chỉ định sự căn chỉnh của các điểm vào hàm.
Giá trị mặc định phụ thuộc vào nền tảng và không thay đổi trong
bản phát hành này.
Thư viện chuẩn
Gói testing/synctest mới
Gói testing/synctest mới
cung cấp hỗ trợ để kiểm thử mã đồng thời.
Hàm Test chạy một hàm kiểm thử trong một
“bong bóng” được cô lập. Bên trong bong bóng, thời gian được ảo hóa: các hàm
của gói time hoạt động trên một đồng hồ giả và đồng hồ tiến
lên tức thời nếu tất cả goroutine trong bong bóng đều bị chặn.
Hàm Wait chờ tất cả goroutine trong
bong bóng hiện tại bị chặn.
Gói này lần đầu có trong Go 1.24 dưới dạng GOEXPERIMENT=synctest, với
API hơi khác một chút. Thử nghiệm này hiện đã được đưa vào trạng thái
khả dụng chung. API cũ vẫn còn nếu đặt GOEXPERIMENT=synctest,
nhưng sẽ bị loại bỏ trong Go 1.26.
Gói thử nghiệm mới encoding/json/v2
Go 1.25 bao gồm một triển khai JSON thử nghiệm mới,
có thể được bật bằng cách đặt biến môi trường
GOEXPERIMENT=jsonv2 tại thời điểm build.
Khi được bật, có hai gói mới khả dụng:
- Gói
encoding/json/v2là một bản sửa đổi lớn của góiencoding/json. - Gói
encoding/json/jsontextcung cấp xử lý cấp thấp hơn cho cú pháp JSON.
Ngoài ra, khi GOEXPERIMENT “jsonv2” được bật:
- Gói
encoding/jsonsử dụng triển khai JSON mới. Hành vi marshaling và unmarshaling không bị ảnh hưởng, nhưng nội dung văn bản của các lỗi được trả về bởi hàm trong gói có thể thay đổi. - Gói
encoding/jsonchứa một số tùy chọn mới có thể được sử dụng để cấu hình marshaler và unmarshaler.
Triển khai mới hoạt động tốt hơn đáng kể so với triển khai hiện có trong nhiều trường hợp. Nhìn chung, hiệu năng encoding là tương đương giữa hai triển khai và decoding nhanh hơn đáng kể trong triển khai mới. Xem kho lưu trữ github.com/go-json-experiment/jsonbench để có phân tích chi tiết hơn.
Xem vấn đề đề xuất để biết thêm chi tiết.
Chúng tôi khuyến khích người dùng của encoding/json kiểm thử
chương trình của họ với GOEXPERIMENT=jsonv2 được bật để giúp phát hiện
bất kỳ vấn đề tương thích nào với triển khai mới.
Chúng tôi kỳ vọng thiết kế của encoding/json/v2
sẽ tiếp tục phát triển. Chúng tôi khuyến khích các nhà phát triển dùng thử
API mới và cung cấp phản hồi về vấn đề đề xuất.
Các thay đổi nhỏ đối với thư viện
archive/tar
Triển khai Writer.AddFS hiện hỗ trợ các liên kết tượng trưng
cho những hệ thống tệp triển khai io/fs.ReadLinkFS.
encoding/asn1
Unmarshal và UnmarshalWithParams
hiện phân tích cú pháp các kiểu ASN.1 T61String và BMPString nhất quán hơn. Điều này có thể
khiến một số mã hóa không đúng định dạng trước đây vẫn được chấp nhận giờ đây bị từ chối.
crypto
MessageSigner là một interface ký mới có thể được các bộ ký triển khai nếu muốn tự băm thông điệp cần ký. Một hàm mới cũng được giới thiệu, SignMessage, hàm này cố gắng nâng cấp một interface Signer thành MessageSigner, sử dụng phương thức MessageSigner.SignMessage nếu thành công, và Signer.Sign nếu không. Điều này có thể được sử dụng khi mã muốn hỗ trợ cả Signer và MessageSigner.
Việc thay đổi thiết lập fips140 trong GODEBUG setting sau khi chương trình đã khởi động giờ đây không còn tác dụng.
Trước đây, điều này được ghi nhận là không được phép và có thể gây panic nếu bị thay đổi.
SHA-1, SHA-256 và SHA-512 giờ đây chậm hơn trên amd64 khi không có các lệnh AVX2. Tất cả bộ xử lý máy chủ (và hầu hết các bộ xử lý khác) được sản xuất từ năm 2015 đều hỗ trợ AVX2.
crypto/ecdsa
Các hàm và phương thức mới ParseRawPrivateKey,
ParseUncompressedPublicKey,
PrivateKey.Bytes và
PublicKey.Bytes triển khai các mã hóa cấp thấp, thay thế nhu cầu sử dụng các hàm và phương thức của crypto/elliptic hoặc math/big.
Khi chế độ FIPS 140-3 được bật, việc ký giờ đây nhanh hơn gấp bốn lần, tương đương với hiệu năng của chế độ không phải FIPS.
crypto/ed25519
Khi chế độ FIPS 140-3 được bật, việc ký giờ đây nhanh hơn gấp bốn lần, tương đương với hiệu năng của chế độ không phải FIPS.
crypto/elliptic
Các phương thức ẩn và không được ghi nhận Inverse và CombinedMult trên một số triển khai Curve đã bị xóa.
crypto/rsa
PublicKey không còn tuyên bố rằng giá trị modulus được xử lý như bí mật. VerifyPKCS1v15 và VerifyPSS trước đây đã cảnh báo rằng mọi đầu vào đều là công khai và có thể bị lộ, đồng thời có các tấn công toán học có thể khôi phục modulus từ các giá trị công khai khác.
Việc tạo khóa giờ đây nhanh hơn gấp ba lần.
crypto/sha1
Việc băm hiện nhanh hơn gấp hai lần trên amd64 khi có các chỉ thị SHA-NI.
crypto/sha3
Phương thức mới SHA3.Clone triển khai hash.Cloner.
Việc băm hiện nhanh hơn gấp hai lần trên các bộ xử lý Apple M.
crypto/tls
Trường mới ConnectionState.CurveID cung cấp cơ chế trao đổi khóa được dùng để thiết lập kết nối.
Callback mới Config.GetEncryptedClientHelloKeys có thể được dùng để thiết lập các EncryptedClientHelloKey mà máy chủ sử dụng khi máy khách gửi phần mở rộng Encrypted Client Hello.
Các thuật toán chữ ký SHA-1 hiện không còn được cho phép trong các quá trình bắt tay TLS 1.2, theo RFC 9155.
Chúng có thể được bật lại bằng thiết lập GODEBUG tlssha1=1.
Khi chế độ FIPS 140-3 được bật, Extended Master Secret hiện là bắt buộc trong TLS 1.2, và Ed25519 cùng X25519MLKEM768 hiện được cho phép.
Các máy chủ TLS hiện ưu tiên phiên bản giao thức được hỗ trợ cao nhất, ngay cả khi đó không phải là phiên bản giao thức được máy khách ưu tiên nhất.
Cả máy khách và máy chủ TLS hiện nghiêm ngặt hơn trong việc tuân theo đặc tả và từ chối hành vi không đúng đặc tả. Các kết nối với các đối tác tuân thủ sẽ không bị ảnh hưởng.
crypto/x509
CreateCertificate, CreateCertificateRequest, và CreateRevocationList hiện có thể chấp nhận interface ký crypto.MessageSigner cũng như crypto.Signer. Điều này cho phép các hàm này sử dụng các signer triển khai interface ký “one-shot”, trong đó việc băm được thực hiện như một phần của thao tác ký thay vì do bên gọi thực hiện.
CreateCertificate hiện sử dụng SHA-256 đã cắt ngắn để điền SubjectKeyId nếu trường này bị thiếu.
Thiết lập GODEBUG x509sha256skid=0 sẽ khôi phục về SHA-1.
ParseCertificate hiện từ chối các chứng chỉ chứa phần mở rộng BasicConstraints có pathLenConstraint âm.
ParseCertificate hiện xử lý các chuỗi được mã hóa bằng các kiểu ASN.1 T61String và BMPString nhất quán hơn. Điều này có thể khiến một số mã hóa không đúng định dạng trước đây vẫn được chấp nhận nay bị từ chối.
debug/elf
Gói debug/elf bổ sung hai hằng số mới:
PT_RISCV_ATTRIBUTESSHT_RISCV_ATTRIBUTESđể phân tích cú pháp ELF của RISC-V.
go/ast
Các hàm FilterPackage, PackageExports và
MergePackageFiles, cùng với kiểu MergeMode và các
hằng số của nó, đều đã bị loại bỏ sử dụng, vì chúng chỉ được dùng với
cơ chế Object và Package đã lỗi thời từ lâu.
Hàm mới PreorderStack, giống như Inspect, duyệt qua cây cú pháp
và cung cấp quyền kiểm soát việc đi xuống các cây con, nhưng để tiện lợi
nó cũng cung cấp ngăn xếp của các nút bao quanh tại mỗi
điểm.
go/parser
Hàm ParseDir đã bị loại bỏ sử dụng.
go/token
Phương thức mới FileSet.AddExistingFiles cho phép các
File hiện có được thêm vào một FileSet,
hoặc một FileSet được tạo cho một tập hợp
File tùy ý, giúp giảm bớt các vấn đề liên quan đến một
FileSet toàn cục duy nhất trong các ứng dụng chạy lâu dài.
go/types
Var hiện có phương thức Var.Kind phân loại biến thành một trong
các loại: cấp gói, receiver, tham số, kết quả, biến cục bộ hoặc
trường của struct.
Hàm mới LookupSelection tra cứu trường hoặc phương thức của một
tên và kiểu receiver đã cho, giống như hàm hiện có LookupFieldOrMethod
nhưng trả về kết quả dưới dạng một Selection.
hash
Interface mới XOF có thể được triển khai bởi các “hàm đầu ra có thể mở rộng”, là các hàm băm có độ dài đầu ra tùy ý hoặc không giới hạn như SHAKE.
Các hàm băm triển khai interface Cloner mới có thể trả về bản sao trạng thái của chúng. Tất cả các triển khai Hash trong thư viện chuẩn hiện đều triển khai Cloner.
hash/maphash
Phương thức Hash.Clone mới triển khai hash.Cloner.
io/fs
Một interface ReadLinkFS mới cung cấp khả năng đọc các liên kết tượng trưng trong một hệ thống tệp.
log/slog
GroupAttrs tạo một nhóm Attr từ một lát cắt các giá trị Attr.
Record hiện có phương thức Source, trả về vị trí nguồn của nó hoặc nil nếu không khả dụng.
mime/multipart
Hàm trợ giúp mới FileContentDisposition xây dựng các trường tiêu đề Content-Disposition dạng multipart.
net
LookupMX và Resolver.LookupMX hiện trả về các tên DNS trông giống địa chỉ IP hợp lệ, cũng như các tên miền hợp lệ.
Trước đây, nếu một máy chủ tên trả về một địa chỉ IP dưới dạng tên DNS, LookupMX sẽ loại bỏ nó, theo yêu cầu của các RFC.
Tuy nhiên, trên thực tế các máy chủ tên đôi khi vẫn trả về địa chỉ IP.
Trên Windows, ListenMulticastUDP hiện hỗ trợ các địa chỉ IPv6.
Trên Windows, hiện có thể chuyển đổi giữa một os.File và một kết nối mạng. Cụ thể, các hàm FileConn, FilePacketConn, và FileListener hiện đã được triển khai, và trả về một kết nối mạng hoặc listener tương ứng với một tệp đang mở.
Tương tự, các phương thức File của TCPConn, UDPConn, UnixConn, IPConn, TCPListener, và UnixListener hiện đã được triển khai, và trả về os.File bên dưới của một kết nối mạng.
net/http
CrossOriginProtection mới triển khai các cơ chế bảo vệ chống lại Cross-Site Request Forgery (CSRF) bằng cách từ chối các yêu cầu trình duyệt cross-origin không an toàn.
Nó sử dụng siêu dữ liệu Fetch của trình duyệt hiện đại, không yêu cầu token hoặc cookie, đồng thời hỗ trợ các cách bỏ qua dựa trên origin và mẫu.
os
Trên Windows, NewFile hiện hỗ trợ các handle được mở cho I/O bất đồng bộ (nghĩa là,
syscall.FILE_FLAG_OVERLAPPED được chỉ định trong lời gọi syscall.CreateFile).
Các handle này được liên kết với cổng hoàn tất I/O của runtime Go,
cung cấp các lợi ích sau cho File tương ứng:
- Các phương thức I/O (
File.Read,File.Write,File.ReadAt, vàFile.WriteAt) không chặn một luồng OS. - Các phương thức deadline (
File.SetDeadline,File.SetReadDeadline, vàFile.SetWriteDeadline) được hỗ trợ.
Cải tiến này đặc biệt hữu ích cho các ứng dụng giao tiếp qua named pipe trên Windows.
Lưu ý rằng một handle chỉ có thể được liên kết với một cổng hoàn tất tại một thời điểm.
Nếu handle được cung cấp cho NewFile đã được liên kết với một cổng hoàn tất,
File được trả về sẽ bị hạ cấp xuống chế độ I/O đồng bộ.
Trong trường hợp này, các phương thức I/O sẽ chặn một luồng OS, và các phương thức deadline không có tác dụng.
Các filesystem được trả về bởi DirFS và Root.FS triển khai interface mới io/fs.ReadLinkFS.
CopyFS hỗ trợ symlink khi sao chép các filesystem triển khai io/fs.ReadLinkFS.
Kiểu Root hỗ trợ các phương thức bổ sung sau:
Root.ChmodRoot.ChownRoot.ChtimesRoot.LchownRoot.LinkRoot.MkdirAllRoot.ReadFileRoot.ReadlinkRoot.RemoveAllRoot.RenameRoot.SymlinkRoot.WriteFile
reflect
Hàm TypeAssert mới cho phép chuyển đổi một Value trực tiếp thành một giá trị Go
có kiểu đã cho. Điều này giống như sử dụng phép khẳng định kiểu trên kết quả của Value.Interface,
nhưng tránh việc cấp phát bộ nhớ không cần thiết.
regexp/syntax
Cú pháp lớp ký tự \p{name} và \P{name} hiện chấp nhận các tên
Any, ASCII, Assigned, Cn và LC, cũng như các bí danh danh mục Unicode như \p{Letter} cho \pL.
Theo Unicode TR18, chúng cũng hiện sử dụng
tra cứu tên không phân biệt chữ hoa chữ thường, bỏ qua khoảng trắng, dấu gạch dưới và dấu gạch nối.
runtime
Các hàm dọn dẹp được lập lịch bởi AddCleanup hiện được thực thi
đồng thời và song song, giúp các thao tác dọn dẹp phù hợp hơn cho việc
sử dụng nhiều như gói unique. Lưu ý rằng từng thao tác dọn dẹp riêng lẻ vẫn nên
chuyển công việc của mình sang một goroutine mới nếu chúng phải thực thi hoặc
chặn trong thời gian dài để tránh chặn hàng đợi dọn dẹp.
Một thiết lập mới GODEBUG=checkfinalizers=1 giúp tìm các vấn đề phổ biến với
finalizer và thao tác dọn dẹp, chẳng hạn như các vấn đề được mô tả trong hướng dẫn
GC.
Ở chế độ này, runtime chạy chẩn đoán trong mỗi chu kỳ thu gom rác,
và cũng sẽ thường xuyên báo cáo độ dài của hàng đợi finalizer và
dọn dẹp tới stderr để giúp xác định các vấn đề với
finalizer và/hoặc thao tác dọn dẹp chạy trong thời gian dài.
Xem tài liệu GODEBUG
để biết thêm chi tiết.
Hàm SetDefaultGOMAXPROCS mới đặt GOMAXPROCS thành giá trị
mặc định của runtime, như thể biến môi trường GOMAXPROCS chưa được đặt. Điều này
hữu ích để bật mặc định GOMAXPROCS mới nếu nó đã bị
vô hiệu hóa bởi biến môi trường GOMAXPROCS hoặc một lần gọi trước đó tới
GOMAXPROCS.
runtime/pprof
Hồ sơ mutex cho tranh chấp trên các khóa nội bộ của runtime hiện trỏ chính xác đến phần kết thúc của vùng tới hạn gây ra độ trễ. Điều này khớp với hành vi của hồ sơ đối với tranh chấp trên các giá trị sync.Mutex. Thiết lập runtimecontentionstacks cho GODEBUG, vốn cho phép chọn hành vi bất thường của Go 1.22 đến 1.24 đối với phần này của hồ sơ, hiện đã bị loại bỏ.
sync
Phương thức mới WaitGroup.Go giúp mẫu sử dụng phổ biến để tạo và đếm goroutine trở nên thuận tiện hơn.
testing
Các phương thức mới T.Attr, B.Attr, và F.Attr ghi một thuộc tính vào nhật ký kiểm thử. Một thuộc tính là một khóa và giá trị tùy ý được liên kết với một kiểm thử.
Ví dụ, trong một kiểm thử có tên TestF,
t.Attr("key", "value") ghi:
=== ATTR TestF key value
Với cờ -json, các thuộc tính xuất hiện dưới dạng một hành động mới “attr”.
Phương thức mới Output của T, B và F cung cấp một io.Writer ghi vào cùng luồng đầu ra kiểm thử như TB.Log. Giống như TB.Log, đầu ra được thụt lề, nhưng không bao gồm số dòng và tệp.
Hàm AllocsPerRun hiện panic nếu các kiểm thử song song đang chạy.
Kết quả của AllocsPerRun vốn không ổn định nếu các kiểm thử khác đang chạy.
Hành vi panic mới giúp phát hiện các lỗi như vậy.
testing/fstest
MapFS triển khai interface io/fs.ReadLinkFS mới.
TestFS sẽ kiểm tra chức năng của interface io/fs.ReadLinkFS nếu được triển khai.
TestFS sẽ không còn lần theo các liên kết tượng trưng để tránh đệ quy không giới hạn.
unicode
Map danh sách bí danh CategoryAliases mới cung cấp quyền truy cập vào các tên bí danh của danh mục, chẳng hạn như “Letter” cho “L”.
Các danh mục mới Cn và LC lần lượt định nghĩa các codepoint chưa được gán và các chữ cái có phân biệt chữ hoa chữ thường.
Các danh mục này luôn được Unicode định nghĩa nhưng đã vô tình bị bỏ sót trong các phiên bản Go trước đó.
Danh mục C hiện bao gồm Cn, nghĩa là đã thêm tất cả các code point chưa được gán.
unique
Gói unique hiện thu hồi các giá trị interned nhanh hơn, hiệu quả hơn và song song hơn. Do đó, các ứng dụng sử dụng Make hiện ít có khả năng gặp tình trạng bộ nhớ tăng đột biến khi có nhiều giá trị thực sự duy nhất được intern.
Các giá trị được truyền vào Make có chứa Handle trước đây yêu cầu nhiều chu kỳ thu gom rác để được thu thập, tỷ lệ thuận với độ sâu của chuỗi giá trị Handle. Hiện nay, khi không còn được sử dụng, chúng được thu thập kịp thời trong một chu kỳ duy nhất.
Các cổng
Darwin
Như đã thông báo trong ghi chú bản phát hành Go 1.24, Go 1.25 yêu cầu macOS 12 Monterey hoặc mới hơn. Hỗ trợ cho các phiên bản trước đã bị ngừng.
Windows
Go 1.25 là bản phát hành cuối cùng chứa cổng windows/arm 32-bit bị lỗi (GOOS=windows GOARCH=arm). Cổng này sẽ bị xóa trong Go 1.26.
AMD64
Ở chế độ GOAMD64=v3 hoặc cao hơn, trình biên dịch hiện sẽ sử dụng các lệnh fused multiply-add để làm cho phép tính số thực nhanh hơn và chính xác hơn. Điều này có thể thay đổi các giá trị số thực chính xác mà một chương trình tạo ra.
Để tránh việc hợp nhất, hãy sử dụng phép ép kiểu float64 rõ ràng, như float64(a*b)+c.
Loong64
Cổng linux/loong64 hiện hỗ trợ trình phát hiện race, thu thập thông tin traceback từ mã C bằng runtime.SetCgoTraceback, và liên kết các chương trình cgo bằng chế độ liên kết nội bộ.
RISC-V
Cổng linux/riscv64 hiện hỗ trợ chế độ xây dựng plugin.
Biến môi trường GORISCV64 hiện chấp nhận một giá trị mới rva23u64, giá trị này chọn hồ sơ ứng dụng chế độ người dùng RVA23U64.