Ghi chú phát hành Go 1.9

Giới thiệu về Go 1.9

Bản phát hành Go mới nhất, phiên bản 1.9, ra đời sáu tháng sau Go 1.8 và là bản phát hành thứ mười trong dòng Go 1.x. Có hai thay đổi về ngôn ngữ: bổ sung hỗ trợ cho bí danh kiểu và xác định khi nào các phép toán dấu phẩy động có thể được gộp lại. 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.

Bản phát hành bổ sung hỗ trợ thời gian đơn điệu trong suốt, song song hóa việc biên dịch các hàm trong một gói, hỗ trợ tốt hơn cho các hàm trợ giúp kiểm thử, bao gồm một gói thao tác bit mới, và thêm kiểu map đồng thời mới.

Thay đổi về ngôn ngữ

Có hai thay đổi về ngôn ngữ.

Go giờ hỗ trợ bí danh kiểu để hỗ trợ việc sửa mã dần dần khi chuyển một kiểu giữa các gói. Tài liệu thiết kế bí danh kiểumột bài viết về tái cấu trúc trình bày vấn đề này chi tiết. Tóm lại, khai báo bí danh kiểu có dạng:

type T1 = T2

Khai báo này giới thiệu tên bí danh T1 — một cách viết thay thế — cho kiểu được biểu thị bởi T2; nghĩa là cả T1T2 đều biểu thị cùng một kiểu.

Một thay đổi ngôn ngữ nhỏ hơn là đặc tả ngôn ngữ giờ chỉ rõ khi nào các phép toán dấu phẩy động được phép gộp lại, chẳng hạn bằng cách sử dụng lệnh “fused multiply and add” (FMA) của kiến trúc để tính x*y + z mà không làm tròn kết quả trung gian x*y. Để ép làm tròn trung gian, viết float64(x*y) + z.

Các nền tảng

Không có hệ điều hành hay kiến trúc bộ xử lý mới được hỗ trợ trong bản phát hành này.

ppc64x yêu cầu POWER8

Cả GOARCH=ppc64GOARCH=ppc64le giờ đều yêu cầu hỗ trợ ít nhất POWER8. Trong các bản phát hành trước, chỉ GOARCH=ppc64le yêu cầu POWER8, còn kiến trúc ppc64 big-endian hỗ trợ phần cứng cũ hơn.

FreeBSD

Go 1.9 là bản phát hành cuối cùng chạy trên FreeBSD 9.3, vốn đã không được FreeBSD hỗ trợ. Go 1.10 sẽ yêu cầu FreeBSD 10.3 trở lên.

OpenBSD 6.0

Go 1.9 giờ bật tạo PT_TLS cho các tệp nhị phân cgo và do đó yêu cầu OpenBSD 6.0 trở lên. Go 1.9 không còn hỗ trợ OpenBSD 5.9.

Các vấn đề đã biết

Có một số sự không ổn định trên FreeBSD đã được biết nhưng chưa được hiểu rõ. Điều này có thể dẫn đến sự cố chương trình trong các trường hợp hiếm gặp. Xem issue 15658. Mọi sự trợ giúp để giải quyết vấn đề dành riêng cho FreeBSD này đều được trân trọng.

Go đã ngừng chạy các builder NetBSD trong chu kỳ phát triển Go 1.9 do các crash kernel của NetBSD, bao gồm cả NetBSD 7.1. Khi Go 1.9 được phát hành, NetBSD 7.1.1 cũng được phát hành với một bản sửa lỗi. Tuy nhiên, tại thời điểm này chúng tôi không có builder NetBSD nào vượt qua bộ kiểm thử. Mọi sự trợ giúp điều tra các vấn đề NetBSD khác nhau đều được trân trọng.

Công cụ

Biên dịch song song

Trình biên dịch Go giờ hỗ trợ biên dịch các hàm của một gói song song, tận dụng nhiều nhân xử lý. Điều này bổ sung thêm vào hỗ trợ biên dịch song song các gói riêng biệt đã có sẵn của lệnh go. Biên dịch song song được bật theo mặc định, nhưng có thể tắt bằng cách đặt biến môi trường GO19CONCURRENTCOMPILATION thành 0.

Khớp vendor với ./…

Theo yêu cầu phổ biến, ./... giờ không còn khớp với các gói trong thư mục vendor trong các công cụ chấp nhận tên gói, chẳng hạn như go test. Để khớp với thư mục vendor, viết ./vendor/....

Di chuyển GOROOT

Công cụ go giờ sẽ sử dụng đường dẫn nơi nó được gọi để cố xác định vị trí gốc của cây cài đặt Go. Điều này có nghĩa là nếu toàn bộ cài đặt Go được chuyển đến vị trí mới, công cụ go vẫn tiếp tục hoạt động bình thường. Điều này có thể bị ghi đè bằng cách đặt GOROOT trong môi trường, điều chỉ nên làm trong các trường hợp đặc biệt. Lưu ý rằng điều này không ảnh hưởng đến kết quả của hàm runtime.GOROOT, hàm này sẽ tiếp tục báo cáo vị trí cài đặt ban đầu; điều này có thể được sửa trong các bản phát hành sau.

Trình biên dịch

Phép chia số phức giờ tương thích với C99. Điều này luôn đúng trong gccgo và giờ đã được sửa trong trình biên dịch gc.

Trình liên kết giờ sẽ tạo thông tin DWARF cho các tệp thực thi cgo trên Windows.

Trình biên dịch giờ bao gồm phạm vi từ vựng trong DWARF được tạo ra nếu cờ -N -l được cung cấp, cho phép các debugger ẩn các biến không trong phạm vi. Phần .debug_info giờ là DWARF phiên bản 4.

Các giá trị của GOARMGO386 giờ ảnh hưởng đến build ID của gói đã biên dịch, như được sử dụng bởi bộ nhớ đệm dependency của công cụ go.

Trình hợp ngữ

Lệnh ARM bốn toán hạng MULA giờ được hợp ngữ đúng, với thanh ghi cộng là đối số thứ ba và thanh ghi kết quả là đối số thứ tư và cuối cùng. Trong các bản phát hành trước, hai ý nghĩa bị đổi ngược. Dạng ba toán hạng, trong đó đối số thứ tư ngầm định giống như đối số thứ ba, không bị ảnh hưởng. Mã sử dụng lệnh MULA bốn toán hạng sẽ cần được cập nhật, nhưng chúng tôi tin rằng dạng này rất hiếm khi được sử dụng. MULAWTMULAWB đã sử dụng thứ tự đúng trong mọi dạng và không thay đổi.

Trình hợp ngữ giờ hỗ trợ ADDSUBPS/PD, hoàn thiện hai lệnh SSE3 x86 còn thiếu.

Doc

Danh sách đối số dài giờ được cắt bớt. Điều này cải thiện khả năng đọc của go doc trên một số mã được tạo tự động.

Xem tài liệu về các trường struct giờ được hỗ trợ. Ví dụ: go doc http.Client.Jar.

Env

Cờ -json mới của go env cho phép xuất JSON, thay vì định dạng đầu ra mặc định dành riêng cho hệ điều hành.

Test

Lệnh go test chấp nhận cờ -list mới, nhận một biểu thức chính quy làm đối số và in ra stdout tên của bất kỳ test, benchmark hay example nào khớp với nó, mà không chạy chúng.

Pprof

Các profile được tạo bởi gói runtime/pprof giờ bao gồm thông tin symbol, do đó chúng có thể được xem bằng go tool pprof mà không cần tệp nhị phân đã tạo ra profile.

Lệnh go tool pprof giờ sử dụng thông tin proxy HTTP được xác định trong môi trường, sử dụng http.ProxyFromEnvironment.

Vet

Lệnh vet đã được tích hợp tốt hơn vào công cụ go, do đó go vet giờ hỗ trợ tất cả các cờ build tiêu chuẩn trong khi các cờ riêng của vet giờ cũng có thể truy cập được từ go vet cũng như từ go tool vet.

Gccgo

Do sự đồng bộ lịch phát hành nửa năm một lần của Go với lịch phát hành hàng năm của GCC, GCC phiên bản 7 chứa phiên bản Go 1.8.3 của gccgo. Chúng tôi dự kiến rằng bản phát hành tiếp theo, GCC 8, sẽ chứa phiên bản Go 1.10 của gccgo.

Runtime

Call stack với các frame được inline

Người dùng của runtime.Callers nên tránh kiểm tra trực tiếp slice PC kết quả và thay vào đó sử dụng runtime.CallersFrames để có được cái nhìn đầy đủ về call stack, hoặc runtime.Caller để lấy thông tin về một caller duy nhất. Điều này là vì một phần tử riêng lẻ của slice PC không thể tính toán cho các frame được inline hay các sắc thái khác của call stack.

Cụ thể, mã lặp trực tiếp qua slice PC và sử dụng các hàm như runtime.FuncForPC để giải quyết từng PC riêng lẻ sẽ bỏ lỡ các frame được inline. Để có cái nhìn đầy đủ về stack, mã như vậy nên sử dụng CallersFrames. Tương tự, mã không nên giả định rằng độ dài được trả về bởi Callers là bất kỳ chỉ số nào về độ sâu call. Thay vào đó, nên đếm số frame được trả về bởi CallersFrames.

Mã truy vấn một caller duy nhất ở độ sâu cụ thể nên sử dụng Caller thay vì truyền một slice có độ dài 1 cho Callers.

runtime.CallersFrames đã có sẵn từ Go 1.7, do đó mã có thể được cập nhật trước khi nâng cấp lên Go 1.9.

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ờ các cải tiến trong bộ gom rác, mã được tạo tốt hơn và các tối ưu hóa trong thư viện cốt lõi.

Bộ gom rác

Các hàm thư viện từng kích hoạt thu gom rác stop-the-world giờ kích hoạt thu gom rác đồng thời. Cụ thể, runtime.GC, debug.SetGCPercentdebug.FreeOSMemory giờ kích hoạt thu gom rác đồng thời, chỉ chặn goroutine đang gọi cho đến khi thu gom rác hoàn tất.

Hàm debug.SetGCPercent chỉ kích hoạt thu gom rác nếu cần ngay lập tức do giá trị GOGC mới. Điều này cho phép điều chỉnh GOGC theo thời gian thực.

Hiệu suất phân bổ đối tượng lớn được cải thiện đáng kể trong các ứng dụng sử dụng heap lớn (>50GB) chứa nhiều đối tượng lớn.

Hàm runtime.ReadMemStats giờ mất ít hơn 100µs ngay cả với các heap rất lớn.

Thư viện chuẩn

Hỗ trợ thời gian đơn điệu trong suốt

Gói time giờ theo dõi thời gian đơn điệu một cách trong suốt trong mỗi giá trị Time, làm cho việc tính toán thời gian giữa hai giá trị Time trở thành một thao tác an toàn khi có điều chỉnh đồng hồ thực. Xem tài liệu góitài liệu thiết kế để biết chi tiết.

Gói thao tác bit mới

Go 1.9 bao gồm một gói mới, math/bits, với các triển khai được tối ưu hóa để thao tác bit. Trên hầu hết các kiến trúc, các hàm trong gói này được trình biên dịch nhận ra thêm và xử lý như các intrinsic để có hiệu suất tốt hơn.

Các hàm trợ giúp kiểm thử

Các phương thức (*T).Helper(*B).Helper mới đánh dấu hàm đang gọi là hàm trợ giúp kiểm thử. Khi in thông tin tệp và dòng, hàm đó sẽ bị bỏ qua. Điều này cho phép viết các hàm trợ giúp kiểm thử trong khi vẫn có số dòng hữu ích cho người dùng.

Map đồng thời

Kiểu Map mới trong gói sync là một map đồng thời với thời gian load, store và delete khấu hao không đổi. Nhiều goroutine có thể gọi các phương thức của Map đồng thời một cách an toàn.

Nhãn profiler

Gói runtime/pprof giờ hỗ trợ thêm nhãn vào các bản ghi profiler pprof. Nhãn tạo thành một map key-value được sử dụng để phân biệt các lời gọi cùng một hàm trong các ngữ cảnh khác nhau khi xem các profile bằng lệnh pprof. Hàm Do mới của gói pprof chạy mã liên kết với một số nhãn được cung cấp. Các hàm mới khác trong gói giúp làm việc với nhãn.

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í.

archive/zip

Writer ZIP giờ đặt bit UTF-8 trong FileHeader.Flags khi thích hợp.

crypto/rand

Trên Linux, Go giờ gọi system call getrandom mà không có cờ GRND_NONBLOCK; nó giờ sẽ chặn cho đến khi kernel có đủ randomness. Trên các kernel không có system call getrandom, Go tiếp tục đọc từ /dev/urandom.

crypto/x509

Trên các hệ thống Unix, các biến môi trường SSL_CERT_FILESSL_CERT_DIR giờ có thể được sử dụng để ghi đè vị trí mặc định của hệ thống cho tệp chứng chỉ SSL và thư mục tệp chứng chỉ SSL, tương ứng.

Tệp FreeBSD /usr/local/etc/ssl/cert.pem giờ được bao gồm trong đường dẫn tìm kiếm chứng chỉ.

Gói giờ hỗ trợ các domain bị loại trừ trong các ràng buộc tên. Ngoài việc thực thi các ràng buộc đó, CreateCertificate sẽ tạo chứng chỉ với các ràng buộc tên bị loại trừ nếu chứng chỉ mẫu được cung cấp có trường ExcludedDNSDomains mới được điền.

Nếu bất kỳ phần mở rộng SAN nào, kể cả không có tên DNS, có mặt trong chứng chỉ, thì Common Name từ Subject bị bỏ qua. Trong các bản phát hành trước, mã chỉ kiểm tra xem có SAN tên DNS trong chứng chỉ hay không.

database/sql

Gói giờ sẽ sử dụng Stmt đã lưu trong bộ nhớ đệm nếu có trong Tx.Stmt. Điều này ngăn các câu lệnh bị chuẩn bị lại mỗi khi Tx.Stmt được gọi.

Gói giờ cho phép driver triển khai trình kiểm tra đối số của riêng họ bằng cách triển khai driver.NamedValueChecker. Điều này cũng cho phép driver hỗ trợ các kiểu tham số OUTPUTINOUT. Out nên được sử dụng để trả về các tham số đầu ra khi driver hỗ trợ.

Rows.Scan giờ có thể quét các kiểu string do người dùng định nghĩa. Trước đây gói hỗ trợ quét vào các kiểu số như type Int int64. Giờ nó cũng hỗ trợ quét vào các kiểu string như type String string.

Phương thức DB.Conn mới trả về kiểu Conn mới đại diện cho một kết nối độc quyền đến cơ sở dữ liệu từ connection pool. Tất cả các truy vấn chạy trên Conn sẽ sử dụng cùng một kết nối bên dưới cho đến khi Conn.Close được gọi để trả kết nối về connection pool.

encoding/asn1

NullBytesNullRawValue mới đại diện cho kiểu ASN.1 NULL.

encoding/base32

Phương thức Encoding.WithPadding mới bổ sung hỗ trợ cho các ký tự đệm tùy chỉnh và tắt đệm.

encoding/csv

Trường Reader.ReuseRecord mới kiểm soát xem các lời gọi đến Read có thể trả về một slice chia sẻ backing array của slice được trả về từ lần gọi trước để cải thiện hiệu suất hay không.

fmt

Cờ sharp (’#’) giờ được hỗ trợ khi in số dấu phẩy động và số phức. Nó sẽ luôn in dấu thập phân cho %e, %E, %f, %F, %g%G; nó sẽ không xóa các số 0 ở cuối cho %g%G.

hash/fnv

Gói giờ bao gồm hỗ trợ hash FNV-1 và FNV-1a 128-bit với New128New128a, tương ứng.

html/template

Gói giờ báo lỗi nếu một escaper được định nghĩa trước (một trong “html”, “urlquery” và “js”) được tìm thấy trong pipeline và không khớp với quyết định của auto-escaper. Điều này tránh một số vấn đề bảo mật hoặc tính đúng đắn. Giờ việc sử dụng một trong những escaper này luôn là no-op hoặc lỗi. (Trường hợp no-op giúp việc chuyển đổi từ text/template dễ dàng hơn.)

image

Phương thức Rectangle.Intersect giờ trả về một Rectangle bằng không khi được gọi trên các hình chữ nhật liền kề nhưng không chồng lên nhau, như đã ghi trong tài liệu. Trong các bản phát hành trước, nó sẽ không chính xác trả về một Rectangle rỗng nhưng khác không.

image/color

Công thức chuyển đổi YCbCr sang RGBA đã được điều chỉnh để đảm bảo rằng các điều chỉnh làm tròn bao phủ toàn bộ phạm vi RGBA [0, 0xffff].

image/png

Trường Encoder.BufferPool mới cho phép chỉ định một EncoderBufferPool, sẽ được encoder sử dụng để lấy các buffer EncoderBuffer tạm thời khi mã hóa ảnh PNG. Việc sử dụng BufferPool giảm số lượng phân bổ bộ nhớ được thực hiện khi mã hóa nhiều ảnh.

Gói giờ hỗ trợ giải mã ảnh grayscale 8-bit trong suốt (“Gray8”).

math/big

Các phương thức IsInt64IsUint64 mới báo cáo xem một Int có thể được biểu diễn như một giá trị int64 hay uint64 hay không.

mime/multipart

Trường FileHeader.Size mới mô tả kích thước của một tệp trong một tin nhắn multipart.

net

Resolver.StrictErrors mới cung cấp khả năng kiểm soát cách trình phân giải DNS tích hợp của Go xử lý các lỗi tạm thời trong các truy vấn bao gồm nhiều sub-query, chẳng hạn như tra cứu địa chỉ A+AAAA.

Resolver.Dial mới cho phép một Resolver sử dụng hàm dial tùy chỉnh.

JoinHostPort giờ chỉ đặt địa chỉ trong ngoặc vuông nếu host chứa dấu hai chấm. Trong các bản phát hành trước, nó cũng bao địa chỉ trong ngoặc vuông nếu chứa dấu phần trăm (’%’).

Các phương thức mới TCPConn.SyscallConn, IPConn.SyscallConn, UDPConn.SyscallConnUnixConn.SyscallConn cung cấp quyền truy cập vào các file descriptor bên dưới của kết nối.

Giờ có thể an toàn khi gọi Dial với địa chỉ thu được từ (*TCPListener).String() sau khi tạo listener bằng Listen(“tcp”, “:0”). Trước đây nó thất bại trên một số máy với stack IPv6 được cấu hình không đầy đủ.

net/http

Phương thức Cookie.String, được sử dụng cho các header CookieSet-Cookie, giờ đặt các giá trị trong ngoặc kép nếu giá trị chứa khoảng trắng hoặc dấu phẩy.

Các thay đổi ở Server:

  • ServeMux giờ bỏ qua các port trong header host khi khớp handler. Host được khớp không thay đổi cho các yêu cầu CONNECT.
  • Phương thức Server.ServeTLS mới bọc Server.Serve với hỗ trợ TLS được thêm vào.
  • Server.WriteTimeout giờ áp dụng cho các kết nối HTTP/2 và được thực thi theo từng stream.
  • HTTP/2 giờ sử dụng bộ lập lịch ghi ưu tiên theo mặc định. Các frame được lập lịch theo các ưu tiên HTTP/2 như mô tả trong RFC 7540 Section 5.3.
  • Handler HTTP được trả về bởi StripPrefix giờ gọi handler được cung cấp với một bản sao đã sửa đổi của *http.Request gốc. Bất kỳ mã nào lưu trữ trạng thái theo yêu cầu trong các map được khóa bởi *http.Request nên sử dụng Request.Context, Request.WithContextcontext.WithValue thay thế.
  • LocalAddrContextKey giờ chứa địa chỉ mạng thực tế của kết nối thay vì địa chỉ giao diện được sử dụng bởi listener.

Các thay đổi ở Client & Transport:

  • Transport giờ hỗ trợ thực hiện các yêu cầu qua proxy SOCKS5 khi URL được trả về bởi Transport.Proxy có scheme socks5.

net/http/fcgi

Hàm ProcessEnv mới trả về các biến môi trường FastCGI liên kết với một yêu cầu HTTP mà không có trường http.Request phù hợp, chẳng hạn như REMOTE_USER.

net/http/httptest

Phương thức Server.Client mới trả về một HTTP client được cấu hình để thực hiện yêu cầu đến server kiểm thử.

Phương thức Server.Certificate mới trả về chứng chỉ TLS của server kiểm thử, nếu có.

net/http/httputil

ReverseProxy giờ proxy tất cả các trailer phản hồi HTTP/2, ngay cả những trailer không được khai báo trong header phản hồi ban đầu. Các trailer không được khai báo như vậy được sử dụng bởi giao thức gRPC.

os

Gói os giờ sử dụng runtime poller nội bộ cho I/O tệp. Điều này giảm số lượng thread cần thiết cho các thao tác đọc/ghi trên pipe, và loại bỏ các race condition khi một goroutine đóng tệp trong khi goroutine khác đang sử dụng tệp đó cho I/O.

Trên Windows, Args giờ được điền mà không cần shell32.dll, cải thiện thời gian khởi động tiến trình thêm 1-7 ms.

os/exec

Gói os/exec giờ ngăn việc tạo các tiến trình con với bất kỳ biến môi trường trùng lặp nào. Nếu Cmd.Env chứa các khóa môi trường trùng lặp, chỉ giá trị cuối cùng trong slice cho mỗi khóa trùng lặp được sử dụng.

os/user

LookupLookupId giờ hoạt động trên các hệ thống Unix khi CGO_ENABLED=0 bằng cách đọc tệp /etc/passwd.

LookupGroupLookupGroupId giờ hoạt động trên các hệ thống Unix khi CGO_ENABLED=0 bằng cách đọc tệp /etc/group.

reflect

Hàm MakeMapWithSize mới tạo một map với gợi ý dung lượng.

runtime

Các traceback được tạo bởi runtime và được ghi trong các profile giờ chính xác khi có inlining. Để lấy traceback theo chương trình, các ứng dụng nên sử dụng runtime.CallersFrames thay vì lặp trực tiếp qua kết quả của runtime.Callers.

Trên Windows, Go không còn ép buộc đồng hồ hệ thống chạy ở độ phân giải cao khi chương trình nhàn rỗi. Điều này sẽ giảm tác động của các chương trình Go lên tuổi thọ pin.

Trên FreeBSD, GOMAXPROCSruntime.NumCPU giờ dựa trên CPU mask của tiến trình, thay vì tổng số CPU.

Runtime có hỗ trợ sơ bộ cho Android O.

runtime/debug

Gọi SetGCPercent với giá trị âm không còn chạy thu gom rác ngay lập tức nữa.

runtime/trace

Trace thực thi giờ hiển thị các sự kiện mark assist, chỉ ra khi nào một goroutine ứng dụng bị buộc phải hỗ trợ thu gom rác vì nó đang phân bổ quá nhanh.

Các sự kiện “Sweep” giờ bao gồm toàn bộ quá trình tìm kiếm không gian trống cho một phân bổ, thay vì ghi lại từng span riêng lẻ được sweep. Điều này giảm độ trễ phân bổ khi trace các chương trình phân bổ nhiều. Sự kiện sweep hiển thị bao nhiêu byte đã được sweep và bao nhiêu đã được thu hồi.

sync

Mutex giờ công bằng hơn.

syscall

Trường Credential.NoSetGroups mới kiểm soát xem các hệ thống Unix có thực hiện system call setgroups để thiết lập các nhóm bổ sung khi khởi động tiến trình mới hay không.

Trường SysProcAttr.AmbientCaps mới cho phép thiết lập ambient capabilities trên Linux 4.3 trở lên khi tạo tiến trình mới.

Trên Linux x86 64-bit, độ trễ tạo tiến trình đã được tối ưu hóa bằng cách sử dụng CLONE_VFORKCLONE_VM.

Interface Conn mới mô tả một số kiểu trong gói net có thể cung cấp quyền truy cập vào file descriptor bên dưới của chúng bằng cách sử dụng interface RawConn mới.

testing/quick

Gói giờ chọn các giá trị trong phạm vi đầy đủ khi tạo các số ngẫu nhiên int64uint64; trong các bản phát hành trước, các giá trị được tạo luôn bị giới hạn trong phạm vi [-262, 262).

Trong các bản phát hành trước, sử dụng giá trị Config.Rand nil khiến một bộ tạo số ngẫu nhiên xác định cố định được sử dụng. Giờ nó sử dụng một bộ tạo số ngẫu nhiên được khởi tạo bằng thời gian hiện tại. Để có hành vi cũ, đặt Config.Rand thành rand.New(rand.NewSource(0)).

text/template

Việc xử lý các block rỗng, vốn bị hỏng bởi một thay đổi Go 1.8 làm cho kết quả phụ thuộc vào thứ tự của các template, đã được sửa, khôi phục lại hành vi cũ của Go 1.7.

time

Các phương thức Duration.RoundDuration.Truncate mới xử lý việc làm tròn và cắt bớt duration thành bội số của một duration đã cho.

Việc lấy thời gian và ngủ giờ hoạt động đúng dưới Wine.

Nếu một giá trị Time có số đọc đồng hồ đơn điệu, biểu diễn chuỗi của nó (như được trả về bởi String) giờ bao gồm một trường cuối cùng "m=±value", trong đó value là số đọc đồng hồ đơn điệu được định dạng là số giây thập phân.

Cơ sở dữ liệu múi giờ tzdata được bao gồm đã được cập nhật lên phiên bản 2017b. Như thường lệ, nó chỉ được sử dụng nếu hệ thống chưa có sẵn cơ sở dữ liệu.