Ghi chú phát hành Go 1.13

Giới thiệu về Go 1.13

Bản phát hành Go mới nhất, phiên bản 1.13, ra đời sáu tháng sau Go 1.12. Hầu hết các thay đổi nằm ở phần triển khai của bộ công cụ, runtime và 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 các chương trình Go sẽ tiếp tục biên dịch và chạy như trước.

Kể từ Go 1.13, lệnh go mặc định tải xuống và xác thực các module bằng mirror module Go và cơ sở dữ liệu checksum Go do Google vận hành. Xem https://proxy.golang.org/privacy để biết thông tin về quyền riêng tư của các dịch vụ này và tài liệu lệnh go để biết chi tiết cấu hình, bao gồm cách tắt việc sử dụng các máy chủ này hoặc dùng máy chủ khác. Nếu bạn phụ thuộc vào các module không công khai, hãy xem tài liệu cấu hình môi trường.

Thay đổi ngôn ngữ

Theo đề xuất về literal số, Go 1.13 hỗ trợ tập hợp tiền tố literal số đồng nhất và hiện đại hơn.

  • Literal số nguyên nhị phân: Tiền tố 0b hoặc 0B biểu thị literal số nguyên nhị phân như 0b1011.
  • Literal số nguyên bát phân: Tiền tố 0o hoặc 0O biểu thị literal số nguyên bát phân như 0o660. Ký hiệu bát phân cũ dùng số 0 dẫn đầu tiếp theo là các chữ số bát phân vẫn hợp lệ.
  • Literal số thực thập lục phân: Tiền tố 0x hoặc 0X giờ có thể dùng để biểu thị phần định trị của số thực ở dạng thập lục phân như 0x1.0p-1021. Số thực thập lục phân phải luôn có số mũ, viết bằng chữ p hoặc P theo sau là số mũ dạng thập phân. Số mũ chia tỉ lệ phần định trị theo lũy thừa 2.
  • Literal số phức: Hậu tố phần ảo i giờ có thể dùng với bất kỳ literal (nhị phân, thập phân, thập lục phân) số nguyên hoặc số thực nào.
  • Dấu phân cách chữ số: Các chữ số trong bất kỳ literal số nào đều có thể tách nhau (nhóm lại) bằng dấu gạch dưới, ví dụ 1_000_000, 0b_1010_0110, hoặc 3.1415_9265. Dấu gạch dưới có thể xuất hiện giữa hai chữ số bất kỳ hoặc giữa tiền tố literal và chữ số đầu tiên.

Theo đề xuất về đếm dịch có dấu, Go 1.13 bỏ hạn chế yêu cầu số đếm dịch phải là số không dấu. Thay đổi này loại bỏ nhu cầu dùng nhiều phép chuyển đổi uint giả tạo, vốn chỉ được thêm vào để thỏa mãn hạn chế (đã bị xóa) này của toán tử <<>>.

Các thay đổi ngôn ngữ này được thực hiện thông qua thay đổi trong trình biên dịch, cùng với các thay đổi nội bộ trong các gói thư viện go/scannertext/scanner (literal số), cũng như go/types (số đếm dịch có dấu).

Nếu mã của bạn sử dụng module và tệp go.mod chỉ định phiên bản ngôn ngữ, hãy đảm bảo đặt ít nhất là 1.13 để có được các thay đổi ngôn ngữ này. Bạn có thể thực hiện bằng cách chỉnh sửa tệp go.mod trực tiếp, hoặc chạy go mod edit -go=1.13.

Các nền tảng

Go 1.13 là bản phát hành cuối cùng chạy trên Native Client (NaCl).

Với GOARCH=wasm, biến môi trường mới GOWASM nhận danh sách phân cách bằng dấu phẩy các tính năng thực nghiệm mà tệp nhị phân được biên dịch cùng. Các giá trị hợp lệ được ghi lại tại đây.

AIX

AIX trên PPC64 (aix/ppc64) giờ hỗ trợ cgo, liên kết ngoài, và các chế độ build c-archivepie.

Android

Các chương trình Go hiện tương thích với Android 10.

Darwin

Như đã thông báo trong ghi chú phát hành Go 1.12, Go 1.13 giờ yêu cầu macOS 10.11 El Capitan hoặc mới hơn; hỗ trợ cho các phiên bản cũ hơn đã bị ngừng.

FreeBSD

Như đã thông báo trong ghi chú phát hành Go 1.12, Go 1.13 giờ yêu cầu FreeBSD 11.2 hoặc mới hơn; hỗ trợ cho các phiên bản cũ hơn đã bị ngừng. FreeBSD 12.0 hoặc mới hơn yêu cầu kernel có tùy chọn COMPAT_FREEBSD11 được bật (đây là mặc định).

Illumos

Go giờ hỗ trợ Illumos với GOOS=illumos. Build tag illumos bao hàm build tag solaris.

Windows

Phiên bản Windows được chỉ định bởi các tệp nhị phân Windows liên kết nội bộ giờ là Windows 7 thay vì NT 4.0. Đây đã là phiên bản tối thiểu bắt buộc cho Go, nhưng có thể ảnh hưởng đến hành vi của các lệnh gọi hệ thống có chế độ tương thích ngược. Các lệnh này giờ sẽ hoạt động đúng như tài liệu mô tả. Các tệp nhị phân liên kết ngoài (bất kỳ chương trình nào dùng cgo) luôn chỉ định phiên bản Windows mới hơn.

Công cụ

Modules

Biến môi trường

Biến môi trường GO111MODULE tiếp tục mặc định là auto, nhưng cài đặt auto giờ kích hoạt chế độ module-aware của lệnh go bất cứ khi nào thư mục làm việc hiện tại chứa, hoặc nằm dưới một thư mục chứa, tệp go.mod, kể cả khi thư mục hiện tại nằm trong GOPATH/src. Thay đổi này đơn giản hóa việc di chuyển mã hiện có trong GOPATH/src và bảo trì liên tục các gói nhận biết module bên cạnh các importer không nhận biết module.

Biến môi trường mới GOPRIVATE chỉ định các đường dẫn module không có sẵn công khai. Nó đóng vai trò là giá trị mặc định cho các biến cấp thấp hơn GONOPROXYGONOSUMDB, cung cấp kiểm soát chi tiết hơn về các module nào được tải qua proxy và xác minh bằng cơ sở dữ liệu checksum.

Biến môi trường GOPROXY giờ có thể được đặt thành danh sách URL proxy phân cách bằng dấu phẩy hoặc token đặc biệt direct, và giá trị mặc định của nó giờ là https://proxy.golang.org,direct. Khi phân giải đường dẫn gói thành module chứa nó, lệnh go sẽ thử lần lượt tất cả các đường dẫn module ứng viên trên từng proxy trong danh sách. Proxy không thể tiếp cận hoặc mã HTTP khác 404 hoặc 410 sẽ kết thúc tìm kiếm mà không tham chiếu đến các proxy còn lại.

Biến môi trường mới GOSUMDB xác định tên, và tùy chọn khóa công khai và URL máy chủ, của cơ sở dữ liệu để tham chiếu checksum của các module chưa được liệt kê trong tệp go.sum của module chính. Nếu GOSUMDB không bao gồm URL tường minh, URL được chọn bằng cách thăm dò các URL GOPROXY để tìm endpoint hỗ trợ cơ sở dữ liệu checksum, rồi truy cập trực tiếp đến cơ sở dữ liệu được đặt tên nếu không có proxy nào hỗ trợ. Nếu GOSUMDB được đặt thành off, cơ sở dữ liệu checksum không được tham chiếu và chỉ các checksum hiện có trong tệp go.sum được xác minh.

Người dùng không thể tiếp cận proxy mặc định và cơ sở dữ liệu checksum (ví dụ do cấu hình firewall hoặc sandbox) có thể tắt chúng bằng cách đặt GOPROXY thành direct và/hoặc GOSUMDB thành off. go env -w có thể được dùng để đặt giá trị mặc định cho các biến này độc lập với nền tảng:

go env -w GOPROXY=direct
go env -w GOSUMDB=off

go get

Trong chế độ module-aware, go get với cờ -u giờ cập nhật tập hợp module nhỏ hơn, nhất quán hơn với tập hợp gói được cập nhật bởi go get -u trong chế độ GOPATH. go get -u tiếp tục cập nhật các module và gói được đặt tên trên dòng lệnh, nhưng ngoài ra chỉ cập nhật các module chứa các gói được nhập bởi các gói được đặt tên, thay vì toàn bộ dependency module bắc cầu của các module chứa các gói được đặt tên.

Lưu ý rằng go get -u (không có tham số thêm) giờ chỉ cập nhật các import bắc cầu của gói trong thư mục hiện tại. Để thay vào đó cập nhật tất cả các gói được nhập bắc cầu bởi module chính (bao gồm cả dependency kiểm thử), dùng go get -u all.

Kết quả của các thay đổi trên đối với go get -u, lệnh con go get không còn hỗ trợ cờ -m, vốn khiến go get dừng trước khi tải gói. Cờ -d vẫn được hỗ trợ, và tiếp tục khiến go get dừng sau khi tải mã nguồn cần thiết để build dependency của các gói được đặt tên.

Mặc định, go get -u trong chế độ module chỉ nâng cấp các dependency không phải test, giống như trong chế độ GOPATH. Nó giờ cũng chấp nhận cờ -t, vốn (như trong chế độ GOPATH) khiến go get bao gồm các gói được nhập bởi các test của các gói được đặt tên trên dòng lệnh.

Trong chế độ module-aware, lệnh con go get giờ hỗ trợ hậu tố phiên bản @patch. Hậu tố @patch chỉ định rằng module được đặt tên, hoặc module chứa gói được đặt tên, phải được cập nhật lên phiên bản patch cao nhất có cùng major và minor với phiên bản tìm thấy trong build list.

Nếu module được truyền làm tham số cho go get mà không có hậu tố phiên bản đã được yêu cầu ở phiên bản mới hơn phiên bản đã phát hành mới nhất, nó sẽ giữ nguyên phiên bản mới hơn. Điều này nhất quán với hành vi của cờ -u đối với module dependency. Điều này ngăn ngừa việc hạ cấp bất ngờ từ các pre-release. Hậu tố phiên bản mới @upgrade yêu cầu hành vi này một cách tường minh. @latest yêu cầu tường minh phiên bản mới nhất bất kể phiên bản hiện tại.

Xác thực phiên bản

Khi trích xuất module từ hệ thống kiểm soát phiên bản, lệnh go giờ thực hiện xác thực bổ sung trên chuỗi phiên bản được yêu cầu.

Chú thích phiên bản +incompatible bỏ qua yêu cầu nhập phiên bản ngữ nghĩa đối với các kho lưu trữ xuất hiện trước khi module được giới thiệu. Lệnh go giờ xác minh rằng phiên bản đó không bao gồm tệp go.mod tường minh.

Lệnh go giờ xác minh ánh xạ giữa pseudo-version và metadata kiểm soát phiên bản. Cụ thể:

  • Tiền tố phiên bản phải có dạng vX.0.0, hoặc được dẫn xuất từ tag trên tổ tiên của revision được đặt tên, hoặc được dẫn xuất từ tag bao gồm build metadata trên revision được đặt tên.
  • Chuỗi ngày phải khớp với timestamp UTC của revision.
  • Tên ngắn của revision phải dùng cùng số ký tự như những gì lệnh go sẽ tạo ra. (Với SHA-1 hash như dùng bởi git, tiền tố 12 chữ số.)

Nếu directive require trong module chính dùng pseudo-version không hợp lệ, thường có thể sửa bằng cách rút gọn phiên bản về chỉ còn commit hash và chạy lại lệnh go, ví dụ go list -m all hoặc go mod tidy. Ví dụ,

require github.com/docker/docker v1.14.0-0.20190319215453-e7b5f7dbe98c

có thể rút gọn thành

require github.com/docker/docker e7b5f7dbe98c

hiện phân giải thành

require github.com/docker/docker v0.7.3-0.20190319215453-e7b5f7dbe98c

Nếu một trong các dependency bắc cầu của module chính yêu cầu phiên bản hoặc pseudo-version không hợp lệ, phiên bản không hợp lệ có thể được thay thế bằng phiên bản hợp lệ bằng cách dùng directive replace trong tệp go.mod của module chính. Nếu phần thay thế là commit hash, nó sẽ được phân giải thành pseudo-version phù hợp như trên. Ví dụ,

replace github.com/docker/docker v1.14.0-0.20190319215453-e7b5f7dbe98c => github.com/docker/docker e7b5f7dbe98c

hiện phân giải thành

replace github.com/docker/docker v1.14.0-0.20190319215453-e7b5f7dbe98c => github.com/docker/docker v0.7.3-0.20190319215453-e7b5f7dbe98c

Lệnh Go

Lệnh go env giờ chấp nhận cờ -w để đặt giá trị mặc định cho mỗi người dùng của một biến môi trường được lệnh go nhận diện, và cờ -u tương ứng để bỏ đặt giá trị mặc định đã đặt trước đó. Giá trị mặc định được đặt qua go env -w được lưu trong tệp go/env trong os.UserConfigDir().

Lệnh go version giờ chấp nhận các tham số là tên file thực thi và thư mục. Khi gọi trên file thực thi, go version in ra phiên bản Go dùng để build file thực thi đó. Nếu dùng cờ -m, go version in ra thông tin phiên bản module nhúng của file thực thi, nếu có. Khi gọi trên thư mục, go version in thông tin về các file thực thi trong thư mục đó và các thư mục con của nó.

Cờ go build mới -trimpath xóa tất cả đường dẫn hệ thống tệp khỏi file thực thi đã biên dịch, để cải thiện tính tái lập của build.

Nếu cờ -o được truyền cho go build trỏ đến thư mục đã tồn tại, go build giờ sẽ ghi các file thực thi vào thư mục đó cho các gói main khớp với tham số gói của nó.

Cờ go build -tags giờ nhận danh sách build tag phân cách bằng dấu phẩy, để cho phép nhiều tag trong GOFLAGS. Dạng phân cách bằng dấu cách đã bị deprecated nhưng vẫn được nhận diện và sẽ được duy trì.

go generate giờ đặt build tag generate để các tệp có thể được tìm kiếm directive nhưng bị bỏ qua trong quá trình build.

Như đã thông báo trong ghi chú phát hành Go 1.12, binary-only package không còn được hỗ trợ. Build một binary-only package (được đánh dấu bằng comment //go:binary-only-package) giờ sẽ gây ra lỗi.

Bộ công cụ trình biên dịch

Trình biên dịch có triển khai phân tích thoát mới chính xác hơn. Đối với hầu hết mã Go, đây là cải tiến (nói cách khác, nhiều biến và biểu thức Go hơn được cấp phát trên stack thay vì heap). Tuy nhiên, độ chính xác tăng lên này cũng có thể phá vỡ mã không hợp lệ vốn hoạt động được trước đây (ví dụ: mã vi phạm quy tắc an toàn unsafe.Pointer). Nếu bạn nhận thấy bất kỳ hồi quy nào có vẻ liên quan, có thể bật lại phân tích thoát cũ bằng go build -gcflags=all=-newescape=false. Tùy chọn dùng phân tích thoát cũ sẽ bị xóa trong bản phát hành tương lai.

Trình biên dịch không còn phát ra các hằng số thực hoặc phức vào tệp go_asm.h. Chúng luôn được phát ra ở dạng không thể dùng làm hằng số số trong mã assembly.

Assembler

Assembler giờ hỗ trợ nhiều lệnh atomic được giới thiệu trong ARM v8.1.

gofmt

gofmt (và cùng với đó là go fmt) giờ chuẩn hóa tiền tố literal số và số mũ để dùng chữ thường, nhưng để nguyên các chữ số thập lục phân. Điều này cải thiện khả năng đọc khi dùng tiền tố bát phân mới (0O thành 0o), và phép viết lại được áp dụng nhất quán. gofmt giờ cũng xóa các số 0 đứng đầu không cần thiết từ literal số nguyên thập phân phần ảo. (Để tương thích ngược, literal số nguyên phần ảo bắt đầu bằng 0 được coi là thập phân, không phải bát phân. Xóa các số 0 đứng đầu thừa tránh gây nhầm lẫn tiềm ẩn.) Ví dụ, 0B1010, 0XabcDEF, 0O660, 1.2E301i thành 0b1010, 0xabcDEF, 0o660, 1.2e31i sau khi áp dụng gofmt.

godocgo doc

Máy chủ web godoc không còn được bao gồm trong bản phân phối nhị phân chính. Để chạy máy chủ web godoc cục bộ, hãy cài đặt thủ công trước:

go get golang.org/x/tools/cmd/godoc
godoc

Lệnh go doc giờ luôn bao gồm mệnh đề package trong đầu ra của nó, ngoại trừ các lệnh. Điều này thay thế hành vi trước đây nơi một heuristic được dùng, khiến mệnh đề package bị bỏ qua trong một số điều kiện nhất định.

Runtime

Thông báo panic do truy cập ngoài phạm vi giờ bao gồm chỉ số ngoài phạm vi và độ dài (hoặc dung lượng) của slice. Ví dụ, s[3] trên slice có độ dài 1 sẽ panic với “runtime error: index out of range [3] with length 1”.

Bản phát hành này cải thiện hiệu năng của hầu hết các lần dùng defer lên 30%.

Runtime giờ tích cực hơn trong việc trả bộ nhớ về hệ điều hành để cung cấp cho các ứng dụng đồng thuê. Trước đây, runtime có thể giữ bộ nhớ trong năm phút hoặc hơn sau khi heap tăng đột biến. Giờ nó sẽ bắt đầu trả lại ngay sau khi heap thu nhỏ. Tuy nhiên, trên nhiều hệ điều hành, bao gồm Linux, chính hệ điều hành thu hồi bộ nhớ một cách lười biếng, vì vậy RSS của tiến trình sẽ không giảm cho đến khi hệ thống chịu áp lực bộ nhớ.

Thư viện chuẩn

TLS 1.3

Như đã thông báo trong Go 1.12, Go 1.13 bật hỗ trợ TLS 1.3 trong gói crypto/tls theo mặc định. Có thể tắt bằng cách thêm giá trị tls13=0 vào biến môi trường GODEBUG. Tùy chọn opt-out sẽ bị xóa trong Go 1.14.

Xem ghi chú phát hành Go 1.12 để biết thông tin tương thích quan trọng.

crypto/ed25519

Gói mới crypto/ed25519 triển khai sơ đồ chữ ký Ed25519. Chức năng này trước đây được cung cấp bởi gói golang.org/x/crypto/ed25519, gói này trở thành wrapper cho crypto/ed25519 khi dùng với Go 1.13+.

Bao bọc lỗi

Go 1.13 hỗ trợ bao bọc lỗi, như đã đề xuất lần đầu trong đề xuất Error Values và được thảo luận trên issue liên quan.

Một lỗi e có thể bao bọc lỗi khác w bằng cách cung cấp phương thức Unwrap trả về w. Cả ew đều có sẵn cho chương trình, cho phép e cung cấp thêm ngữ cảnh cho w hoặc diễn giải lại nó trong khi vẫn cho phép chương trình đưa ra quyết định dựa trên w.

Để hỗ trợ bao bọc, fmt.Errorf giờ có verb %w để tạo lỗi được bao bọc, và ba hàm mới trong gói errors ( errors.Unwrap, errors.Iserrors.As) đơn giản hóa việc mở bao bọc và kiểm tra lỗi được bao bọc.

Để biết thêm thông tin, đọc tài liệu gói errors, hoặc xem Error Value FAQ. Sắp tới sẽ có một bài blog về chủ đề này.

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

Như thường lệ, có nhiều thay đổi và cập nhật nhỏ trong thư viện, được thực hiện với cam kết tương thích của Go 1 trong tâm trí.

bytes

Hàm mới ToValidUTF8 trả về bản sao của slice byte cho trước với mỗi chuỗi byte UTF-8 không hợp lệ được thay thế bằng slice cho trước.

context

Định dạng của các context được trả về bởi WithValue không còn phụ thuộc vào fmt và sẽ không còn stringify theo cách tương tự. Mã phụ thuộc vào cách stringify trước đây có thể bị ảnh hưởng.

crypto/tls

Hỗ trợ SSL phiên bản 3.0 (SSLv3) hiện đã bị deprecated và sẽ bị xóa trong Go 1.14. Lưu ý rằng SSLv3 là giao thức bị phá vỡ về mặt mật mã có trước TLS.

SSLv3 luôn bị tắt theo mặc định, ngoại trừ trong Go 1.12, khi nó vô tình được bật theo mặc định ở phía máy chủ. Giờ nó lại bị tắt theo mặc định. (SSLv3 chưa bao giờ được hỗ trợ phía client.)

Chứng chỉ Ed25519 giờ được hỗ trợ trong TLS phiên bản 1.2 và 1.3.

crypto/x509

Khóa Ed25519 giờ được hỗ trợ trong chứng chỉ và yêu cầu chứng chỉ theo RFC 8410, cũng như bởi các hàm ParsePKCS8PrivateKey, MarshalPKCS8PrivateKey, và ParsePKIXPublicKey.

Các đường dẫn được tìm kiếm cho system roots giờ bao gồm /etc/ssl/cert.pem để hỗ trợ vị trí mặc định trong Alpine Linux 3.7+.

database/sql

Kiểu mới NullTime biểu diễn time.Time có thể null.

Kiểu mới NullInt32 biểu diễn int32 có thể null.

debug/dwarf

Phương thức Data.Type không còn panic nếu gặp DWARF tag không xác định trong đồ thị kiểu. Thay vào đó, nó biểu diễn thành phần đó của kiểu bằng đối tượng UnsupportedType.

errors

Hàm mới As tìm lỗi đầu tiên trong chuỗi lỗi của lỗi đã cho (chuỗi lỗi được bao bọc) khớp với kiểu của target đã cho, và nếu vậy, đặt target bằng giá trị lỗi đó.

Hàm mới Is báo cáo liệu giá trị lỗi đã cho có khớp với lỗi trong chuỗi của lỗi khác không.

Hàm mới Unwrap trả về kết quả của việc gọi Unwrap trên lỗi đã cho, nếu có.

fmt

Các verb in %x%X giờ định dạng số thực và số phức ở ký hiệu thập lục phân, lần lượt là chữ thường và chữ hoa.

Verb in mới %O định dạng số nguyên ở cơ số 8, phát ra tiền tố 0o.

Scanner giờ chấp nhận các giá trị số thực thập lục phân, dấu gạch dưới phân cách chữ số và các tiền tố dẫn đầu 0b0o. Xem Thay đổi ngôn ngữ để biết chi tiết.

Hàm Errorf có verb mới, %w, toán hạng của nó phải là lỗi. Lỗi được trả về từ Errorf sẽ có phương thức Unwrap trả về toán hạng của %w.

go/scanner

Scanner đã được cập nhật để nhận diện các literal số Go mới, cụ thể là literal nhị phân với tiền tố 0b/0B, literal bát phân với tiền tố 0o/0O, và số thực với phần định trị thập lục phân. Hậu tố phần ảo i giờ có thể dùng với bất kỳ literal số nào, và dấu gạch dưới có thể dùng làm dấu phân cách chữ số để nhóm. Xem Thay đổi ngôn ngữ để biết chi tiết.

go/types

Bộ kiểm tra kiểu đã được cập nhật để theo các quy tắc mới về dịch số nguyên. Xem Thay đổi ngôn ngữ để biết chi tiết.

html/template

Khi dùng thẻ <script> với “module” được đặt làm thuộc tính type, mã giờ sẽ được hiểu là JavaScript module script.

log

Hàm mới Writer trả về đích đầu ra cho logger chuẩn.

math/big

Phương thức mới Rat.SetUint64 đặt Rat thành giá trị uint64.

Với Float.Parse, nếu cơ số là 0, dấu gạch dưới có thể dùng giữa các chữ số để dễ đọc. Xem Thay đổi ngôn ngữ để biết chi tiết.

Với Int.SetString, nếu cơ số là 0, dấu gạch dưới có thể dùng giữa các chữ số để dễ đọc. Xem Thay đổi ngôn ngữ để biết chi tiết.

Rat.SetString giờ chấp nhận biểu diễn số thực không phải thập phân.

math/bits

Thời gian thực thi của Add, Sub, Mul, RotateLeft, và ReverseBytes giờ được đảm bảo độc lập với đầu vào.

net

Trên hệ thống Unix nơi use-vc được đặt trong resolv.conf, TCP được dùng để phân giải DNS.

Trường mới ListenConfig.KeepAlive chỉ định khoảng thời gian keep-alive cho các kết nối mạng được listener chấp nhận. Nếu trường này là 0 (mặc định), TCP keep-alive sẽ được bật. Để tắt chúng, đặt giá trị âm.

Lưu ý rằng lỗi được trả về từ I/O trên kết nối bị đóng bởi timeout keep-alive sẽ có phương thức Timeout trả về true khi gọi. Điều này có thể khiến lỗi keep-alive khó phân biệt với lỗi được trả về do bỏ lỡ deadline đặt bởi phương thức SetDeadline và các phương thức tương tự. Mã dùng deadline và kiểm tra chúng bằng phương thức Timeout hoặc os.IsTimeout có thể muốn tắt keep-alive, hoặc dùng errors.Is(syscall.ETIMEDOUT) (trên hệ thống Unix) vốn sẽ trả về true cho timeout keep-alive và false cho timeout deadline.

net/http

Hai trường mới Transport.WriteBufferSizeTransport.ReadBufferSize cho phép chỉ định kích thước buffer ghi và đọc cho Transport. Nếu bất kỳ trường nào bằng không, kích thước mặc định 4KB được dùng.

Trường mới Transport.ForceAttemptHTTP2 kiểm soát liệu HTTP/2 có được bật không khi hàm Dial, DialTLS, hoặc DialContext không rỗng hoặc TLSClientConfig được cung cấp.

Transport.MaxConnsPerHost giờ hoạt động đúng với HTTP/2.

ResponseWriter của TimeoutHandler giờ triển khai interface Pusher.

StatusCode 103 "Early Hints" đã được thêm vào.

Transport giờ dùng triển khai io.ReaderFrom của Request.Body nếu có, để tối ưu hóa việc ghi body.

Khi gặp transfer-encoding không được hỗ trợ, http.Server giờ trả về trạng thái “501 Unimplemented” như theo yêu cầu của đặc tả HTTP RFC 7230 Section 3.3.1.

Các trường mới của Server BaseContextConnContext cho phép kiểm soát chi tiết hơn về các giá trị Context được cung cấp cho request và kết nối.

http.DetectContentType giờ phát hiện đúng chữ ký RAR và có thể phát hiện cả chữ ký RAR v5.

Phương thức mới Clone của Header trả về bản sao của receiver.

Hàm mới NewRequestWithContext đã được thêm vào và chấp nhận Context kiểm soát toàn bộ vòng đời của Request ra ngoài được tạo, phù hợp để dùng với Client.DoTransport.RoundTrip.

Transport không còn ghi log lỗi khi máy chủ đóng nhẹ nhàng các kết nối rảnh bằng phản hồi "408 Request Timeout".

os

Hàm mới UserConfigDir trả về thư mục mặc định để dùng cho dữ liệu cấu hình theo người dùng.

Nếu File được mở bằng cờ O_APPEND, phương thức WriteAt của nó sẽ luôn trả về lỗi.

os/exec

Trên Windows, môi trường cho Cmd luôn kế thừa giá trị %SYSTEMROOT% của tiến trình cha trừ khi trường Cmd.Env bao gồm giá trị tường minh cho nó.

reflect

Phương thức mới Value.IsZero báo cáo liệu Value có phải là giá trị zero cho kiểu của nó không.

Hàm MakeFunc giờ cho phép chuyển đổi gán trên các giá trị được trả về, thay vì yêu cầu khớp kiểu chính xác. Điều này đặc biệt hữu ích khi kiểu được trả về là interface, nhưng giá trị thực sự được trả về là giá trị cụ thể triển khai interface đó.

runtime

Traceback, runtime.Caller, và runtime.Callers giờ tham chiếu đến hàm khởi tạo các biến toàn cục của PKGPKG.init thay vì PKG.init.ializers.

strconv

Với strconv.ParseFloat, strconv.ParseIntstrconv.ParseUint, nếu cơ số là 0, dấu gạch dưới có thể dùng giữa các chữ số để dễ đọc. Xem Thay đổi ngôn ngữ để biết chi tiết.

strings

Hàm mới ToValidUTF8 trả về bản sao của chuỗi đã cho với mỗi chuỗi byte UTF-8 không hợp lệ được thay thế bằng chuỗi đã cho.

sync

Các fast path của Mutex.Lock, Mutex.Unlock, RWMutex.Lock, RWMutex.RUnlock, và Once.Do giờ được inline vào caller của chúng. Với các trường hợp không tranh chấp trên amd64, các thay đổi này làm cho Once.Do nhanh gấp đôi, và các phương thức Mutex/RWMutex nhanh hơn tới 10%.

Pool lớn không còn làm tăng thời gian dừng stop-the-world.

Pool không còn cần được điền lại hoàn toàn sau mỗi GC. Nó giờ giữ lại một số đối tượng qua các GC, thay vì giải phóng tất cả đối tượng, giảm tải đột biến cho người dùng nhiều của Pool.

syscall

Việc sử dụng _getdirentries64 đã được xóa khỏi các build Darwin, để cho phép upload tệp nhị phân Go lên macOS App Store.

Các trường mới ProcessAttributesThreadAttributes trong SysProcAttr đã được giới thiệu cho Windows, công khai các cài đặt bảo mật khi tạo tiến trình mới.

EINVAL không còn được trả về trong chế độ Chmod bằng không trên Windows.

Các giá trị kiểu Errno có thể được kiểm tra so với các giá trị lỗi trong gói os, như ErrExist, bằng cách dùng errors.Is.

syscall/js

TypedArrayOf đã được thay thế bởi CopyBytesToGoCopyBytesToJS để sao chép byte giữa slice byte và Uint8Array.

testing

Khi chạy benchmark, B.N không còn được làm tròn.

Phương thức mới B.ReportMetric cho phép người dùng báo cáo các chỉ số benchmark tùy chỉnh và ghi đè các chỉ số tích hợp.

Các cờ testing giờ được đăng ký trong hàm mới Init, được gọi bởi hàm main được tạo ra cho test. Do đó, các cờ testing giờ chỉ được đăng ký khi chạy file nhị phân test, và các gói gọi flag.Parse trong quá trình khởi tạo gói có thể khiến test thất bại.

text/scanner

Scanner đã được cập nhật để nhận diện các literal số Go mới, cụ thể là literal nhị phân với tiền tố 0b/0B, literal bát phân với tiền tố 0o/0O, và số thực với phần định trị thập lục phân. Ngoài ra, chế độ mới AllowDigitSeparators cho phép literal số chứa dấu gạch dưới làm dấu phân cách chữ số (tắt theo mặc định để tương thích ngược). Xem Thay đổi ngôn ngữ để biết chi tiết.

text/template

Hàm slice mới trả về kết quả của việc cắt tham số đầu tiên theo các tham số tiếp theo.

time

Ngày trong năm giờ được hỗ trợ bởi FormatParse.

Các phương thức Duration mới MicrosecondsMilliseconds trả về duration dưới dạng số nguyên theo đơn vị tương ứng.

unicode

Gói unicode và hỗ trợ liên quan trong toàn hệ thống đã được nâng cấp từ Unicode 10.0 lên Unicode 11.0, bổ sung 684 ký tự mới, bao gồm bảy script mới và 66 emoji mới.