Ghi chú phát hành Go 1.11
Giới thiệu về Go 1.11
Bản phát hành Go mới nhất, phiên bản 1.11, ra đời sáu tháng sau Go 1.10. Phần lớn các thay đổi nằm ở việc triển khai trình biên dịch, runtime và thư viện. Như thường lệ, bản phát hành duy trì cam kết tương thích Go 1. Chúng tôi mong rằ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 về ngôn ngữ
Không có thay đổi nào về đặc tả ngôn ngữ.
Các nền tảng
Như đã thông báo trong ghi chú phát hành Go 1.10, Go 1.11 giờ yêu cầu OpenBSD 6.2 trở lên, macOS 10.10 Yosemite trở lên, hoặc Windows 7 trở lên; hỗ trợ cho các phiên bản trước của các hệ điều hành này đã bị xóa.
Go 1.11 hỗ trợ bản phát hành OpenBSD 6.4 sắp tới. Do các thay đổi trong kernel OpenBSD, các phiên bản Go cũ hơn sẽ không hoạt động trên OpenBSD 6.4.
Có các vấn đề đã biết với NetBSD trên phần cứng i386.
Trình phát hiện race giờ được hỗ trợ trên linux/ppc64le và ở mức độ thấp hơn trên netbsd/amd64. Hỗ trợ trình phát hiện race trên NetBSD có các vấn đề đã biết.
Memory sanitizer (-msan) giờ được hỗ trợ trên linux/arm64.
Các chế độ build c-shared và c-archive giờ được hỗ trợ trên freebsd/amd64.
Trên các hệ thống MIPS 64-bit, các cài đặt biến môi trường mới GOMIPS64=hardfloat (mặc định) và GOMIPS64=softfloat chọn việc sử dụng lệnh phần cứng hay mô phỏng phần mềm cho các phép tính dấu phẩy động. Đối với các hệ thống 32-bit, biến môi trường vẫn là GOMIPS, như đã thêm trong Go 1.10.
Trên các hệ thống ARM soft-float (GOARM=5), Go giờ sử dụng một interface dấu phẩy động phần mềm hiệu quả hơn. Điều này trong suốt với mã Go, nhưng code hợp ngữ ARM sử dụng các lệnh dấu phẩy động không được bảo vệ trên GOARM sẽ bị hỏng và phải được chuyển sang interface mới.
Go 1.11 trên ARMv7 không còn yêu cầu Linux kernel được cấu hình với KUSER_HELPERS. Cài đặt này được bật trong các cấu hình kernel mặc định, nhưng đôi khi bị tắt trong các cấu hình thu gọn.
WebAssembly
Go 1.11 thêm một cổng thử nghiệm cho WebAssembly (js/wasm).
Các chương trình Go hiện tại biên dịch sang một module WebAssembly bao gồm Go runtime để lập lịch goroutine, thu gom rác, map, v.v. Kết quả là, kích thước tối thiểu là khoảng 2 MB, hoặc 500 KB khi nén. Các chương trình Go có thể gọi vào JavaScript bằng gói thử nghiệm mới syscall/js. Kích thước binary và khả năng tương tác với các ngôn ngữ khác chưa được ưu tiên nhưng có thể được giải quyết trong các bản phát hành tương lai.
Do việc thêm giá trị GOOS mới “js” và giá trị GOARCH “wasm”, các tệp Go được đặt tên *_js.go hoặc *_wasm.go giờ sẽ bị bỏ qua bởi các công cụ Go trừ khi các giá trị GOOS/GOARCH đó đang được sử dụng. Nếu bạn có các tên tệp hiện tại khớp với các pattern đó, bạn sẽ cần đổi tên chúng.
Thông tin thêm có thể được tìm thấy trên trang wiki WebAssembly.
Các giá trị GOARCH cho RISC-V được đặt trước
Trình biên dịch Go chính chưa hỗ trợ kiến trúc RISC-V nhưng chúng tôi đã đặt trước các giá trị GOARCH “riscv” và “riscv64”, như được sử dụng bởi Gccgo, hỗ trợ RISC-V. Điều này có nghĩa là các tệp Go được đặt tên *_riscv.go giờ cũng sẽ bị bỏ qua bởi các công cụ Go trừ khi các giá trị GOOS/GOARCH đó đang được sử dụng.
Công cụ
Module, phiên bản gói và quản lý dependency
Go 1.11 thêm hỗ trợ sơ bộ cho một khái niệm mới được gọi là “module,” một giải pháp thay thế cho GOPATH với hỗ trợ tích hợp cho versioning và phân phối gói. Khi sử dụng module, các nhà phát triển không còn bị giới hạn làm việc bên trong GOPATH, thông tin phụ thuộc phiên bản rõ ràng nhưng nhẹ, và các build đáng tin cậy và có thể tái tạo hơn.
Hỗ trợ module được coi là thử nghiệm. Các chi tiết có khả năng thay đổi theo phản hồi từ người dùng Go 1.11, và chúng tôi có nhiều công cụ được lên kế hoạch. Mặc dù chi tiết hỗ trợ module có thể thay đổi, các dự án chuyển đổi sang module bằng Go 1.11 sẽ tiếp tục hoạt động với Go 1.12 và các phiên bản sau. Nếu bạn gặp lỗi khi sử dụng module, vui lòng báo cáo vấn đề để chúng tôi có thể sửa chúng. Để biết thêm thông tin, xem tài liệu lệnh go.
Hạn chế đường dẫn import
Vì hỗ trợ module Go gán ý nghĩa đặc biệt cho ký hiệu @ trong các thao tác dòng lệnh, lệnh go giờ không cho phép sử dụng các đường dẫn import chứa ký hiệu @. Các đường dẫn import như vậy chưa bao giờ được go get cho phép, vì vậy hạn chế này chỉ có thể ảnh hưởng đến người dùng xây dựng cây GOPATH tùy chỉnh bằng các phương tiện khác.
Nạp gói
Gói mới golang.org/x/tools/go/packages cung cấp một API đơn giản để xác định và nạp các gói mã nguồn Go. Mặc dù chưa phải là một phần của thư viện chuẩn, đối với nhiều tác vụ nó thay thế hiệu quả gói go/build, API của gói này không thể hỗ trợ đầy đủ module. Vì nó chạy một lệnh truy vấn ngoài như go list để lấy thông tin về các gói Go, nó cho phép xây dựng các công cụ phân tích hoạt động tốt như nhau với các hệ thống build thay thế như Bazel và Buck.
Yêu cầu bộ nhớ đệm build
Go 1.11 sẽ là bản phát hành cuối cùng hỗ trợ đặt biến môi trường GOCACHE=off để tắt bộ nhớ đệm build, được giới thiệu trong Go 1.10. Bắt đầu từ Go 1.12, bộ nhớ đệm build sẽ là bắt buộc, như một bước hướng tới việc loại bỏ $GOPATH/pkg. Hỗ trợ nạp module và gói được mô tả ở trên đã yêu cầu bộ nhớ đệm build được bật. Nếu bạn đã tắt bộ nhớ đệm build để tránh các vấn đề bạn gặp phải, vui lòng báo cáo vấn đề để cho chúng tôi biết về chúng.
Trình biên dịch
Nhiều hàm hơn giờ đủ điều kiện để được inline theo mặc định, bao gồm các hàm gọi panic.
Trình biên dịch giờ hỗ trợ thông tin cột trong các chỉ thị dòng.
Một định dạng dữ liệu xuất gói mới đã được giới thiệu. Điều này nên trong suốt với người dùng cuối, ngoại trừ việc tăng tốc thời gian build cho các dự án Go lớn. Nếu nó gây ra vấn đề, có thể tắt lại bằng cách truyền -gcflags=all=-iexport=false cho công cụ go khi build một binary.
Trình biên dịch giờ từ chối các biến chưa sử dụng được khai báo trong guard type switch, chẳng hạn như x trong ví dụ sau:
func f(v interface{}) {
switch x := v.(type) {
}
}
Điều này đã bị từ chối bởi cả gccgo và go/types.
Trình hợp ngữ
Trình hợp ngữ cho amd64 giờ chấp nhận các lệnh AVX512.
Gỡ lỗi
Trình biên dịch giờ tạo ra thông tin gỡ lỗi chính xác hơn đáng kể cho các binary được tối ưu hóa, bao gồm thông tin vị trí biến, số dòng và vị trí breakpoint. Điều này nên giúp gỡ lỗi các binary được biên dịch không có -N -l là khả thi. Vẫn còn các hạn chế về chất lượng của thông tin gỡ lỗi, một số là cơ bản, và một số sẽ tiếp tục cải thiện với các bản phát hành tương lai.
Các section DWARF giờ được nén theo mặc định vì thông tin gỡ lỗi mở rộng và chính xác hơn được tạo bởi trình biên dịch. Điều này trong suốt với hầu hết các công cụ ELF (chẳng hạn như debugger trên Linux và *BSD) và được hỗ trợ bởi debugger Delve trên tất cả các nền tảng, nhưng có hỗ trợ hạn chế trong các công cụ gốc trên macOS và Windows. Để tắt nén DWARF, truyền -ldflags=-compressdwarf=false cho công cụ go khi build một binary.
Go 1.11 thêm hỗ trợ thử nghiệm cho việc gọi các hàm Go từ bên trong một debugger. Điều này hữu ích, ví dụ, khi gọi các phương thức String khi dừng tại một breakpoint. Điều này hiện chỉ được hỗ trợ bởi Delve (phiên bản 1.1.0 trở lên).
Test
Kể từ Go 1.10, lệnh go test chạy go vet trên gói đang được kiểm thử, để xác định các vấn đề trước khi chạy kiểm thử. Vì vet kiểm tra kiểu mã với go/types trước khi chạy, các kiểm thử không kiểm tra kiểu giờ sẽ thất bại. Cụ thể, các kiểm thử chứa biến chưa sử dụng bên trong closure được biên dịch với Go 1.10, vì trình biên dịch Go chấp nhận sai (Issue #3059), nhưng giờ sẽ thất bại, vì go/types báo cáo đúng lỗi “unused variable” trong trường hợp này.
Cờ -memprofile cho go test giờ mặc định thành profile “allocs”, ghi lại tổng số byte được phân bổ kể từ khi kiểm thử bắt đầu (bao gồm các byte đã được thu gom rác).
Vet
Lệnh go vet giờ báo cáo lỗi nghiêm trọng khi gói đang được phân tích không kiểm tra kiểu thành công. Trước đây, một lỗi kiểm tra kiểu chỉ khiến một cảnh báo được in, và vet thoát với trạng thái 1.
Ngoài ra, go vet đã trở nên mạnh mẽ hơn khi kiểm tra định dạng cho các wrapper printf. Vet giờ phát hiện lỗi trong ví dụ này:
func wrapper(s string, args ...interface{}) {
fmt.Printf(s, args...)
}
func main() {
wrapper("%s", 42)
}
Trace
Với API chú thích người dùng của gói runtime/trace mới, người dùng có thể ghi lại thông tin cấp ứng dụng trong các trace thực thi và tạo các nhóm goroutine liên quan. Lệnh go tool trace trực quan hóa thông tin này trong chế độ xem trace và trang phân tích task/region người dùng mới.
Cgo
Kể từ Go 1.10, cgo đã dịch một số kiểu con trỏ C sang kiểu Go uintptr. Các kiểu này bao gồm hệ thống phân cấp CFTypeRef trong framework CoreFoundation của Darwin và hệ thống phân cấp jobject trong giao diện JNI của Java. Trong Go 1.11, một số cải tiến đã được thực hiện cho mã phát hiện các kiểu này. Mã sử dụng các kiểu này có thể cần một số cập nhật. Xem ghi chú phát hành Go 1.10 để biết chi tiết.
Lệnh go
Biến môi trường GOFLAGS giờ có thể được sử dụng để đặt các cờ mặc định cho lệnh go. Điều này hữu ích trong một số tình huống nhất định. Liên kết có thể chậm đáng kể trên các hệ thống kém mạnh do DWARF, và người dùng có thể muốn đặt -ldflags=-w theo mặc định. Đối với module, một số người dùng và hệ thống CI sẽ muốn sử dụng vendor luôn, vì vậy họ nên đặt -mod=vendor theo mặc định. Để biết thêm thông tin, xem tài liệu lệnh go.
Godoc
Go 1.11 sẽ là bản phát hành cuối cùng hỗ trợ giao diện dòng lệnh của godoc. Trong các bản phát hành tương lai, godoc sẽ chỉ là một web server. Người dùng nên sử dụng go doc để có đầu ra trợ giúp dòng lệnh thay thế.
Web server godoc giờ hiển thị phiên bản Go nào giới thiệu các tính năng API mới. Phiên bản Go ban đầu của các kiểu, hàm và phương thức được hiển thị căn phải. Ví dụ, xem UserCacheDir, với “1.11” ở bên phải. Đối với các trường struct, các comment inline được thêm khi trường struct được thêm vào trong một phiên bản Go khác với khi bản thân kiểu được giới thiệu. Để xem ví dụ về trường struct, xem ClientTrace.Got1xxResponse.
Gofmt
Một chi tiết nhỏ của định dạng mặc định mã nguồn Go đã thay đổi. Khi định dạng các danh sách biểu thức với comment inline, các comment được căn chỉnh theo một heuristic. Tuy nhiên, trong một số trường hợp việc căn chỉnh sẽ bị tách ra quá dễ dàng, hoặc giới thiệu quá nhiều khoảng trắng. Heuristic đã được thay đổi để hoạt động tốt hơn cho mã do người viết.
Lưu ý rằng những loại cập nhật nhỏ cho gofmt như thế này được mong đợi sẽ xảy ra theo thời gian. Nói chung, các hệ thống cần định dạng nhất quán của mã nguồn Go nên sử dụng một phiên bản cụ thể của binary gofmt. Xem tài liệu gói go/format để biết thêm thông tin.
Run
Lệnh go run giờ cho phép một đường dẫn import đơn, tên thư mục hoặc pattern khớp với một gói đơn. Điều này cho phép go run pkg hoặc go run dir, quan trọng nhất là go run .
Runtime
Runtime giờ sử dụng layout heap thưa, vì vậy không còn giới hạn kích thước heap Go nữa (trước đây, giới hạn là 512GiB). Điều này cũng sửa các lỗi “address space conflict” hiếm gặp trong các binary Go/C hỗn hợp hoặc các binary được biên dịch với -race.
Trên macOS và iOS, runtime giờ sử dụng libSystem.dylib thay vì gọi trực tiếp kernel. Điều này nên làm cho các binary Go tương thích hơn với các phiên bản tương lai của macOS và iOS. Gói syscall vẫn thực hiện các system call trực tiếp; việc sửa điều này được lên kế hoạch cho một bản phát hành tương lai.
Hiệu suất
Như thường lệ, các thay đổi rất đa dạng đến mức khó có thể đưa ra các nhận xét chính xác về hiệu suất. Hầu hết các chương trình nên chạy nhanh hơn một chút, nhờ mã được tạo tốt hơn và các tối ưu hóa trong thư viện cốt lõi.
Có nhiều thay đổi hiệu suất đối với gói math/big cũng như nhiều thay đổi trên toàn cây dành riêng cho GOARCH=arm64.
Trình biên dịch
Trình biên dịch giờ tối ưu hóa các thao tác xóa map có dạng:
for k := range m {
delete(m, k)
}
Trình biên dịch giờ tối ưu hóa mở rộng slice có dạng append(s, make([]T, n)...).
Trình biên dịch giờ thực hiện kiểm tra biên giới và loại bỏ nhánh tích cực hơn đáng kể. Đáng chú ý, giờ nó nhận ra các quan hệ bắc cầu, vì vậy nếu i<j và j<len(s), nó có thể sử dụng các thực tế này để loại bỏ kiểm tra biên giới cho s[i]. Nó cũng hiểu số học đơn giản như s[i-10] và có thể nhận ra nhiều trường hợp quy nạp hơn trong các vòng lặp. Hơn nữa, trình biên dịch giờ sử dụng thông tin biên giới để tối ưu hóa các thao tác dịch chuyển tích cực hơn.
Thư viện chuẩn
Tất cả các thay đổi đối với thư viện chuẩn đều nhỏ.
Các thay đổi nhỏ với thư viện
Như thường lệ, có nhiều thay đổi và cập nhật nhỏ khác nhau đối với thư viện, được thực hiện với cam kết tương thích Go 1 trong tâm trí.
crypto
Một số thao tác crypto, bao gồm ecdsa.Sign, rsa.EncryptPKCS1v15 và rsa.GenerateKey, giờ đọc ngẫu nhiên thêm một byte ngẫu nhiên để đảm bảo các kiểm thử không phụ thuộc vào hành vi nội bộ.
crypto/cipher
Hàm NewGCMWithTagSize mới triển khai Galois Counter Mode với độ dài tag không chuẩn để tương thích với các hệ thống mật mã hiện có.
crypto/rsa
PublicKey giờ triển khai phương thức Size trả về kích thước modulus tính bằng byte.
crypto/tls
Phương thức ExportKeyingMaterial mới của ConnectionState cho phép xuất keying material gắn với kết nối theo RFC 5705.
crypto/x509
Hành vi cũ, không dùng nữa, coi trường CommonName như một hostname khi không có Subject Alternative Names, giờ bị tắt khi CN không phải là hostname hợp lệ. CommonName có thể bị bỏ qua hoàn toàn bằng cách thêm giá trị thử nghiệm x509ignoreCN=1 vào biến môi trường GODEBUG. Khi CN bị bỏ qua, các chứng chỉ không có SAN xác thực theo các chuỗi với các ràng buộc tên thay vì trả về NameConstraintsWithoutSANs.
Các hạn chế sử dụng khóa mở rộng lại chỉ được kiểm tra nếu chúng xuất hiện trong trường KeyUsages của VerifyOptions, thay vì luôn được kiểm tra. Điều này khớp với hành vi của Go 1.9 và trước đó.
Giá trị được trả về bởi SystemCertPool giờ được lưu trong bộ nhớ đệm và có thể không phản ánh các thay đổi hệ thống giữa các lần gọi.
debug/elf
Nhiều hằng số ELFOSABI và EM hơn đã được thêm vào.
encoding/asn1
Marshal và Unmarshal giờ hỗ trợ các chú thích lớp “private” cho các trường.
encoding/base32
Decoder giờ nhất quán trả về io.ErrUnexpectedEOF cho một chunk không hoàn chỉnh. Trước đây nó trả về io.EOF trong một số trường hợp.
encoding/csv
Reader giờ từ chối các nỗ lực đặt trường Comma thành ký tự double-quote, vì ký tự double-quote đã có ý nghĩa đặc biệt trong CSV.
html/template
Gói đã thay đổi hành vi khi một giá trị interface có kiểu được truyền cho một hàm escaper ngầm. Trước đây giá trị như vậy được ghi ra là (một dạng được escape của) <nil>. Giờ các giá trị như vậy bị bỏ qua, giống như một giá trị nil không có kiểu là (và luôn đã) bị bỏ qua.
image/gif
GIF động không lặp giờ được hỗ trợ. Chúng được biểu thị bằng cách có LoopCount là -1.
io/ioutil
Hàm TempFile giờ hỗ trợ chỉ định vị trí đặt các ký tự ngẫu nhiên trong tên tệp. Nếu đối số prefix bao gồm một “*”, chuỗi ngẫu nhiên thay thế “*”. Ví dụ, đối số prefix là “myname.*.bat” sẽ tạo ra tên tệp ngẫu nhiên như “myname.123456.bat”. Nếu không có “*” nào được bao gồm, hành vi cũ được giữ lại, và các chữ số ngẫu nhiên được thêm vào cuối.
math/big
ModInverse giờ trả về nil khi g và n không nguyên tố cùng nhau. Kết quả trước đây không xác định.
mime/multipart
Việc xử lý form-data với tên tệp bị thiếu/rỗng đã được khôi phục về hành vi trong Go 1.9: trong Form cho phần form-data, giá trị có sẵn trong trường Value thay vì trường File. Trong các bản phát hành Go 1.10 đến 1.10.3, một phần form-data với tên tệp bị thiếu/rỗng và trường “Content-Type” không rỗng được lưu trữ trong trường File. Thay đổi này là lỗi trong 1.10 và đã được hoàn nguyên về hành vi 1.9.
mime/quotedprintable
Để hỗ trợ đầu vào không hợp lệ được tìm thấy trong thực tế, gói giờ cho phép các byte không phải ASCII nhưng không xác thực mã hóa của chúng.
net
Kiểu ListenConfig mới và trường Dialer.Control mới cho phép đặt các tùy chọn socket trước khi chấp nhận và tạo kết nối, tương ứng.
Các phương thức Read và Write của syscall.RawConn giờ hoạt động đúng trên Windows.
Gói net giờ tự động sử dụng system call splice trên Linux khi sao chép dữ liệu giữa các kết nối TCP trong TCPConn.ReadFrom, được gọi bởi io.Copy. Kết quả là proxy TCP nhanh hơn, hiệu quả hơn.
Các phương thức TCPConn.File, UDPConn.File, UnixConn.File và IPConn.File không còn đặt *os.File được trả về vào chế độ blocking.
net/http
Kiểu Transport có tùy chọn MaxConnsPerHost mới cho phép giới hạn số kết nối tối đa mỗi host.
Kiểu Cookie có trường SameSite mới (của kiểu mới cũng được đặt tên SameSite) để đại diện cho thuộc tính cookie mới được hầu hết các trình duyệt hỗ trợ gần đây. Transport của net/http không sử dụng thuộc tính SameSite cho chính nó, nhưng gói hỗ trợ phân tích và tuần tự hóa thuộc tính cho các trình duyệt sử dụng.
Không còn được phép tái sử dụng một Server sau khi gọi Shutdown hoặc Close. Điều này chưa bao giờ được hỗ trợ chính thức trong quá khứ và có hành vi thường gây ngạc nhiên. Giờ, tất cả các lời gọi tương lai đến các phương thức Serve của server sẽ trả về lỗi sau khi shutdown hoặc close.
Hằng số StatusMisdirectedRequest giờ được định nghĩa cho mã trạng thái HTTP 421.
HTTP server sẽ không còn hủy context hoặc gửi trên các kênh CloseNotifier khi nhận các yêu cầu HTTP/1.1 được pipeline. Các trình duyệt không sử dụng HTTP pipelining, nhưng một số client (chẳng hạn như apt của Debian) có thể được cấu hình để làm vậy.
ProxyFromEnvironment, được sử dụng bởi DefaultTransport, giờ hỗ trợ ký hiệu CIDR và các port trong biến môi trường NO_PROXY.
net/http/httputil
ReverseProxy có tùy chọn ErrorHandler mới để cho phép thay đổi cách xử lý lỗi.
ReverseProxy giờ cũng truyền các header yêu cầu “TE: trailers” đến backend, theo yêu cầu của giao thức gRPC.
os
Hàm UserCacheDir mới trả về thư mục gốc mặc định để sử dụng cho dữ liệu đã lưu trong bộ nhớ đệm dành riêng cho người dùng.
ModeIrregular mới là một bit FileMode để biểu thị rằng một tệp không phải là tệp thông thường, nhưng không có gì khác được biết về nó, hoặc nó không phải là socket, thiết bị, named pipe, symlink hoặc các kiểu tệp khác mà Go có bit mode được định nghĩa.
Symlink giờ hoạt động đối với người dùng không có đặc quyền trên Windows 10 trên các máy có Developer Mode được bật.
Khi một descriptor không chặn được truyền cho NewFile, *File kết quả sẽ được giữ ở chế độ không chặn. Điều này có nghĩa là I/O cho *File đó sẽ sử dụng runtime poller thay vì một thread riêng, và các phương thức SetDeadline sẽ hoạt động.
os/signal
Hàm Ignored mới báo cáo xem một tín hiệu hiện đang bị bỏ qua hay không.
os/user
Gói os/user giờ có thể được build ở chế độ Go thuần túy bằng cách sử dụng build tag “osusergo”, độc lập với việc sử dụng biến môi trường CGO_ENABLED=0. Trước đây, cách duy nhất để sử dụng triển khai Go thuần túy của gói là tắt hỗ trợ cgo trên toàn bộ chương trình.
runtime
Đặt biến môi trường GODEBUG=tracebackancestors=N giờ mở rộng các traceback với các stack mà tại đó các goroutine được tạo, trong đó N giới hạn số lượng goroutine tổ tiên cần báo cáo.
runtime/pprof
Bản phát hành này thêm kiểu profile “allocs” mới profile tổng số byte được phân bổ kể từ khi chương trình bắt đầu (bao gồm các byte đã được thu gom rác). Điều này giống hệt với profile “heap” hiện có được xem ở chế độ -alloc_space. Giờ go test -memprofile=... báo cáo profile “allocs” thay vì profile “heap”.
sync
Profile mutex giờ bao gồm contention reader/writer cho RWMutex. Contention writer/writer đã được bao gồm trong profile mutex.
syscall
Trên Windows, một số trường đã được thay đổi từ uintptr sang kiểu Pointer mới để tránh các vấn đề với bộ gom rác Go. Thay đổi tương tự đã được thực hiện với gói golang.org/x/sys/windows. Đối với bất kỳ mã nào bị ảnh hưởng, người dùng trước tiên nên di chuyển khỏi gói syscall sang gói golang.org/x/sys/windows, và sau đó thay đổi để sử dụng Pointer, trong khi tuân thủ các quy tắc chuyển đổi unsafe.Pointer.
Trên Linux, tham số flags cho Faccessat giờ được triển khai giống như trong glibc. Trong các bản phát hành Go trước, tham số flags bị bỏ qua.
Trên Linux, tham số flags cho Fchmodat giờ được xác thực. fchmodat của Linux không hỗ trợ tham số flags nên giờ chúng tôi mô phỏng hành vi của glibc và trả về lỗi nếu nó khác không.
text/scanner
Phương thức Scanner.Scan giờ trả về token RawString thay vì String cho các raw string literal.
text/template
Sửa đổi các biến template qua các phép gán giờ được phép thông qua token =:
{{ $v := "init" }}
{{ if true }}
{{ $v = "changed" }}
{{ end }}
v: {{ $v }} {{/* "changed" */}}
Trong các phiên bản trước, các giá trị nil không có kiểu được truyền cho các hàm template bị bỏ qua. Giờ chúng được truyền như các đối số bình thường.
time
Phân tích các múi giờ được biểu thị bằng dấu và offset giờ được hỗ trợ. Trong các phiên bản trước, tên múi giờ số (chẳng hạn như +03) không được coi là hợp lệ, và chỉ các chữ viết tắt ba chữ cái (chẳng hạn như MST) được chấp nhận khi mong đợi tên múi giờ.