Ghi chú phát hành Go 1.6

Giới thiệu về Go 1.6

Bản phát hành Go mới nhất, phiên bản 1.6, ra đời sáu tháng sau phiên bản 1.5. Phần lớn các thay đổi nằm ở phần triển khai ngôn ngữ, runtime và các thư viện. Không có thay đổi nào đối với đặc tả ngôn ngữ. Như thường lệ, bản phát hành 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.

Bản phát hành bổ sung các port mới cho Linux trên MIPS 64-bit và Android trên x86 32-bit; định nghĩa và thực thi các quy tắc chia sẻ con trỏ Go với C; hỗ trợ HTTP/2 tự động, trong suốt; và một cơ chế mới để tái sử dụng template.

Thay đổi về ngôn ngữ

Không có thay đổi nào về ngôn ngữ trong bản phát hành này.

Các port

Go 1.6 bổ sung các port thử nghiệm cho Linux trên MIPS 64-bit (linux/mips64linux/mips64le). Các port này hỗ trợ cgo nhưng chỉ với liên kết nội bộ.

Go 1.6 cũng bổ sung một port thử nghiệm cho Android trên x86 32-bit (android/386).

Trên FreeBSD, Go 1.6 mặc định sử dụng clang thay vì gcc làm trình biên dịch C ngoài.

Trên Linux trên PowerPC 64-bit little-endian (linux/ppc64le), Go 1.6 hiện hỗ trợ cgo với liên kết ngoài và đã gần như đầy đủ tính năng.

Trên NaCl, Go 1.5 yêu cầu phiên bản SDK pepper-41. Go 1.6 bổ sung hỗ trợ cho các phiên bản SDK mới hơn.

Trên các hệ thống x86 32-bit sử dụng chế độ biên dịch -dynlink hoặc -shared, thanh ghi CX hiện bị ghi đè bởi một số tham chiếu bộ nhớ và nên tránh sử dụng trong mã assembly viết tay. Xem tài liệu assembly để biết thêm chi tiết.

Công cụ

Cgo

Có một thay đổi lớn và một thay đổi nhỏ đối với cgo.

Thay đổi lớn là định nghĩa các quy tắc chia sẻ con trỏ Go với mã C, để đảm bảo rằng mã C đó có thể cùng tồn tại với bộ gom rác của Go. Tóm lại, Go và C có thể chia sẻ bộ nhớ được cấp phát bởi Go khi một con trỏ đến bộ nhớ đó được truyền cho C trong một lời gọi cgo, với điều kiện bộ nhớ đó không chứa con trỏ đến bộ nhớ do Go cấp phát, và C không giữ lại con trỏ sau khi lời gọi trả về. Các quy tắc này được runtime kiểm tra trong quá trình thực thi chương trình: nếu runtime phát hiện vi phạm, nó sẽ in thông báo chẩn đoán và làm dừng chương trình. Việc kiểm tra có thể bị tắt bằng cách đặt biến môi trường GODEBUG=cgocheck=0, nhưng lưu ý rằng phần lớn mã được các kiểm tra xác định là không tương thích một cách tinh tế với bộ gom rác theo cách này hay cách khác. Tắt các kiểm tra thường chỉ dẫn đến các chế độ lỗi khó hiểu hơn. Nên ưu tiên sửa mã có vấn đề thay vì tắt các kiểm tra. Xem tài liệu cgo để biết thêm chi tiết.

Thay đổi nhỏ là việc bổ sung các kiểu C.complexfloatC.complexdouble tường minh, tách biệt với complex64complex128 của Go. Giống như các kiểu số khác, kiểu phức hợp của C và kiểu phức hợp của Go không còn có thể thay thế lẫn nhau.

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

Bộ công cụ biên dịch hầu như không thay đổi. Bên trong, thay đổi quan trọng nhất là bộ phân tích cú pháp hiện được viết tay thay vì được tạo ra từ yacc.

Trình biên dịch, trình liên kết và lệnh go có cờ mới -msan, tương tự như -race và chỉ khả dụng trên linux/amd64, cho phép tương tác với Clang MemorySanitizer. Tương tác như vậy chủ yếu hữu ích để kiểm tra một chương trình chứa mã C hoặc C++ đáng ngờ.

Trình liên kết có tùy chọn mới -libgcc để đặt vị trí dự kiến của thư viện hỗ trợ trình biên dịch C khi liên kết mã cgo. Tùy chọn này chỉ được tham khảo khi sử dụng -linkmode=internal, và có thể đặt thành none để tắt việc sử dụng thư viện hỗ trợ.

Việc triển khai các chế độ build bắt đầu từ Go 1.5 đã được mở rộng cho nhiều hệ thống hơn. Bản phát hành này bổ sung hỗ trợ cho chế độ c-shared trên android/386, android/amd64, android/arm64, linux/386linux/arm64; cho chế độ shared trên linux/386, linux/arm, linux/amd64linux/ppc64le; và cho chế độ pie mới (tạo tệp thực thi độc lập vị trí) trên android/386, android/amd64, android/arm, android/arm64, linux/386, linux/amd64, linux/arm, linux/arm64linux/ppc64le. Xem tài liệu thiết kế để biết chi tiết.

Nhắc lại, cờ -X của trình liên kết đã thay đổi trong Go 1.5. Trong Go 1.4 và trước đó, nó nhận hai đối số, như trong

-X importpath.name value

Go 1.5 đã thêm cú pháp thay thế sử dụng một đối số duy nhất là cặp name=value:

-X importpath.name=value

Trong Go 1.5, cú pháp cũ vẫn được chấp nhận, sau khi in cảnh báo gợi ý sử dụng cú pháp mới. Go 1.6 tiếp tục chấp nhận cú pháp cũ và in cảnh báo. Go 1.7 sẽ bỏ hỗ trợ cho cú pháp cũ.

Gccgo

Lịch trình phát hành của các dự án GCC và Go không trùng nhau. GCC phiên bản 5 chứa phiên bản Go 1.4 của gccgo. Bản phát hành tiếp theo, GCC 6, sẽ có phiên bản Go 1.6.1 của gccgo.

Lệnh go

Hoạt động cơ bản của lệnh go không thay đổi, nhưng có một số thay đổi đáng chú ý.

Go 1.5 đã giới thiệu hỗ trợ thử nghiệm cho vendoring, được kích hoạt bằng cách đặt biến môi trường GO15VENDOREXPERIMENT thành 1. Go 1.6 giữ lại hỗ trợ vendoring, không còn được coi là thử nghiệm, và bật theo mặc định. Có thể tắt tường minh bằng cách đặt biến môi trường GO15VENDOREXPERIMENT thành 0. Go 1.7 sẽ bỏ hỗ trợ cho biến môi trường này.

Vấn đề có khả năng xảy ra nhất do bật vendoring theo mặc định xuất hiện trong các cây mã nguồn chứa thư mục có tên vendor hiện có mà không mong muốn được diễn giải theo ngữ nghĩa vendoring mới. Trong trường hợp này, cách sửa đơn giản nhất là đổi tên thư mục thành bất kỳ tên nào khác ngoài vendor và cập nhật bất kỳ đường dẫn import bị ảnh hưởng nào.

Để biết chi tiết về vendoring, xem tài liệu cho lệnh gotài liệu thiết kế.

Có một cờ build mới, -msan, biên dịch Go với hỗ trợ cho LLVM memory sanitizer. Cờ này chủ yếu dành cho việc liên kết với mã C hoặc C++ đang được kiểm tra bằng memory sanitizer.

Lệnh go doc

Go 1.5 đã giới thiệu lệnh go doc, cho phép tham chiếu đến các package chỉ bằng tên package, như trong go doc http. Khi có sự mơ hồ, hành vi của Go 1.5 là sử dụng package có đường dẫn import theo thứ tự từ điển sớm nhất. Trong Go 1.6, sự mơ hồ được giải quyết bằng cách ưu tiên các đường dẫn import có ít thành phần hơn, phá vỡ sự ràng buộc bằng so sánh từ điển. Một tác động quan trọng của thay đổi này là các bản sao gốc của package hiện được ưu tiên hơn các bản sao được vendor. Các tìm kiếm thành công cũng có xu hướng chạy nhanh hơn.

Lệnh go vet

Lệnh go vet hiện chẩn đoán việc truyền giá trị hàm hoặc phương thức làm đối số cho Printf, chẳng hạn như khi truyền f trong khi f() mới là ý định.

Hiệu suất

Như thường lệ, các thay đổi rất chung chung và đa dạng nên rất khó đưa ra tuyên bố chính xác về hiệu suất. Một số chương trình có thể chạy nhanh hơn, một số chậm hơn. Trung bình, các chương trình trong bộ benchmark Go 1 chạy nhanh hơn vài phần trăm trong Go 1.6 so với Go 1.5. Thời gian tạm dừng của bộ gom rác thậm chí còn thấp hơn so với Go 1.5, đặc biệt đối với các chương trình sử dụng lượng bộ nhớ lớn.

Đã có những tối ưu hóa đáng kể mang lại cải thiện hơn 10% cho các triển khai của các package compress/bzip2, compress/gzip, crypto/aes, crypto/elliptic, crypto/ecdsasort.

Thư viện chuẩn

HTTP/2

Go 1.6 bổ sung hỗ trợ trong suốt trong package net/http cho giao thức HTTP/2 mới. Các client và server Go sẽ tự động sử dụng HTTP/2 khi phù hợp khi dùng HTTPS. Không có API được xuất khẩu nào dành riêng cho chi tiết xử lý giao thức HTTP/2, cũng như không có API được xuất khẩu nào dành riêng cho HTTP/1.1.

Các chương trình phải tắt HTTP/2 có thể làm như vậy bằng cách đặt Transport.TLSNextProto (cho client) hoặc Server.TLSNextProto (cho server) thành một map không nil, rỗng.

Các chương trình cần điều chỉnh chi tiết dành riêng cho giao thức HTTP/2 có thể import và sử dụng golang.org/x/net/http2, đặc biệt là các hàm ConfigureServerConfigureTransport.

Runtime

Runtime đã bổ sung tính năng phát hiện nhẹ, theo khả năng tốt nhất việc sử dụng đồng thời sai của map. Như thường lệ, nếu một goroutine đang ghi vào một map, không goroutine nào khác nên đọc hoặc ghi map đó đồng thời. Nếu runtime phát hiện điều kiện này, nó sẽ in chẩn đoán và làm dừng chương trình. Cách tốt nhất để tìm hiểu thêm về vấn đề là chạy chương trình dưới bộ phát hiện race, sẽ xác định race đáng tin cậy hơn và cung cấp thêm chi tiết.

Đối với các panic kết thúc chương trình, runtime hiện mặc định chỉ in stack của goroutine đang chạy, không in tất cả goroutine hiện có. Thường chỉ goroutine hiện tại mới liên quan đến panic, vì vậy việc bỏ qua các goroutine khác sẽ giảm đáng kể đầu ra không liên quan trong thông báo crash. Để xem stack của tất cả goroutine trong thông báo crash, đặt biến môi trường GOTRACEBACK thành all hoặc gọi debug.SetTraceback trước khi crash, và chạy lại chương trình. Xem tài liệu runtime để biết chi tiết.

Cập nhật: Các panic không bắt được nhằm mục đích dump trạng thái của toàn bộ chương trình, chẳng hạn như khi phát hiện timeout hoặc khi xử lý tường minh một tín hiệu nhận được, bây giờ nên gọi debug.SetTraceback("all") trước khi panic. Tìm kiếm các lần sử dụng signal.Notify có thể giúp xác định mã đó.

Trên Windows, các chương trình Go trong Go 1.5 và trước đó đã buộc độ phân giải bộ hẹn giờ Windows toàn cục xuống 1ms khi khởi động bằng cách gọi timeBeginPeriod(1). Go không còn cần điều này để có hiệu suất bộ lập lịch tốt, và việc thay đổi độ phân giải bộ hẹn giờ toàn cục đã gây ra vấn đề trên một số hệ thống, vì vậy lời gọi đã bị loại bỏ.

Khi sử dụng -buildmode=c-archive hoặc -buildmode=c-shared để build một archive hoặc một thư viện chia sẻ, việc xử lý tín hiệu đã thay đổi. Trong Go 1.5, archive hoặc thư viện chia sẻ sẽ cài đặt một trình xử lý tín hiệu cho hầu hết các tín hiệu. Trong Go 1.6, nó sẽ chỉ cài đặt một trình xử lý tín hiệu cho các tín hiệu đồng bộ cần thiết để xử lý panic thời gian chạy trong mã Go: SIGBUS, SIGFPE, SIGSEGV. Xem package os/signal để biết thêm chi tiết.

Reflect

Package reflect đã giải quyết một sự không tương thích lâu dài giữa các bộ công cụ gc và gccgo liên quan đến các kiểu struct lồng nhau không được xuất khẩu chứa các trường được xuất khẩu. Mã duyệt qua các cấu trúc dữ liệu bằng reflection, đặc biệt để triển khai serialization theo tinh thần của các package encoding/jsonencoding/xml, có thể cần được cập nhật.

Vấn đề phát sinh khi sử dụng reflection để duyệt qua một trường kiểu struct lồng nhau không được xuất khẩu vào một trường được xuất khẩu của struct đó. Trong trường hợp này, reflect đã báo cáo không chính xác trường lồng nhau là được xuất khẩu, bằng cách trả về Field.PkgPath rỗng. Bây giờ nó báo cáo chính xác rằng trường không được xuất khẩu nhưng bỏ qua điều đó khi đánh giá quyền truy cập vào các trường được xuất khẩu chứa trong struct.

Cập nhật: Thông thường, mã trước đây duyệt qua các struct và sử dụng

f.PkgPath != ""

để loại trừ các trường không thể truy cập

bây giờ nên dùng

f.PkgPath != "" && !f.Anonymous

Ví dụ, xem các thay đổi đối với việc triển khai của encoding/jsonencoding/xml.

Sắp xếp

Trong package sort, việc triển khai Sort đã được viết lại để thực hiện ít hơn khoảng 10% lần gọi đến các phương thức LessSwap của Interface, với tổng thời gian tiết kiệm tương ứng. Thuật toán mới chọn một thứ tự khác so với trước đây đối với các giá trị bằng nhau (những cặp mà Less(i, j)Less(j, i) đều là false).

Cập nhật: Định nghĩa của Sort không đảm bảo về thứ tự cuối cùng của các giá trị bằng nhau, nhưng hành vi mới vẫn có thể làm hỏng các chương trình mong đợi một thứ tự cụ thể. Các chương trình như vậy nên hoặc tinh chỉnh các triển khai Less của họ để báo cáo thứ tự mong muốn hoặc chuyển sang Stable, giữ nguyên thứ tự đầu vào ban đầu của các giá trị bằng nhau.

Template

Trong package text/template, có hai tính năng mới đáng kể giúp viết template dễ dàng hơn.

Thứ nhất, hiện có thể cắt bỏ khoảng trắng xung quanh các hành động template, điều này giúp định nghĩa template dễ đọc hơn. Dấu trừ ở đầu một hành động có nghĩa là cắt bỏ khoảng trắng trước hành động, và dấu trừ ở cuối một hành động có nghĩa là cắt bỏ khoảng trắng sau hành động. Ví dụ, template

{{23 -}}
   <
{{- 45}}

định dạng thành 23<45.

Thứ hai, hành động {{block}} mới, kết hợp với việc cho phép định nghĩa lại các template có tên, cung cấp một cách đơn giản để định nghĩa các phần của template mà có thể được thay thế trong các lần khởi tạo khác nhau. Có một ví dụ trong package text/template minh họa tính năng mới này.

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

  • Việc triển khai của package archive/tar sửa nhiều lỗi trong các trường hợp hiếm của định dạng tệp. Một thay đổi rõ ràng là phương thức Read của kiểu Reader giờ đây trình bày nội dung của các loại tệp đặc biệt là rỗng, trả về io.EOF ngay lập tức.
  • Trong package archive/zip, kiểu Reader hiện có phương thức RegisterDecompressor, và kiểu Writer hiện có phương thức RegisterCompressor, cho phép kiểm soát tùy chọn nén cho từng tệp zip riêng lẻ. Các phương thức này có quyền ưu tiên hơn các hàm toàn cục RegisterDecompressorRegisterCompressor đã có sẵn.
  • Kiểu Scanner của package bufio giờ có phương thức Buffer, để chỉ định buffer ban đầu và kích thước buffer tối đa sử dụng trong quá trình quét. Điều này cho phép, khi cần, quét các token lớn hơn MaxScanTokenSize. Cũng cho Scanner, package hiện định nghĩa giá trị lỗi ErrFinalToken, để sử dụng bởi các hàm split để hủy xử lý hoặc trả về một token rỗng cuối cùng.
  • Package compress/flate đã đánh dấu không dùng nữa các triển khai lỗi ReadErrorWriteError. Trong Go 1.5, chúng chỉ hiếm khi được trả về khi gặp lỗi; bây giờ chúng không bao giờ được trả về, mặc dù vẫn được định nghĩa để tương thích.
  • Các package compress/flate, compress/gzipcompress/zlib giờ báo cáo io.ErrUnexpectedEOF cho các luồng đầu vào bị cắt ngắn, thay vì io.EOF.
  • Package crypto/cipher hiện ghi đè buffer đích trong trường hợp giải mã GCM thất bại. Điều này cho phép mã AESNI tránh sử dụng buffer tạm thời.
  • Package crypto/tls có nhiều thay đổi nhỏ. Nó hiện cho phép Listen thành công khi ConfigCertificates là nil, miễn là callback GetCertificate được đặt, nó bổ sung hỗ trợ cho các bộ mã hóa RSA với AES-GCM, và nó bổ sung một RecordHeaderError để cho phép client (đặc biệt là package net/http) báo cáo lỗi tốt hơn khi cố gắng kết nối TLS đến một server không phải TLS.
  • Package crypto/x509 giờ cho phép các chứng chỉ chứa số serial âm (về mặt kỹ thuật là lỗi, nhưng tiếc là phổ biến trong thực tế), và nó định nghĩa một InsecureAlgorithmError mới để đưa ra thông báo lỗi tốt hơn khi từ chối chứng chỉ được ký bằng thuật toán không an toàn như MD5.
  • Các package debug/dwarfdebug/elf cùng nhau bổ sung hỗ trợ cho các phần DWARF nén. Mã người dùng không cần cập nhật: các phần được giải nén tự động khi đọc.
  • Package debug/elf bổ sung hỗ trợ cho các phần ELF nén chung. Mã người dùng không cần cập nhật: các phần được giải nén tự động khi đọc. Tuy nhiên, các Section nén không hỗ trợ truy cập ngẫu nhiên: chúng có trường ReaderAt là nil.
  • Package encoding/asn1 giờ xuất khẩu các hằng số tag và class hữu ích cho việc phân tích nâng cao các cấu trúc ASN.1.
  • Cũng trong package encoding/asn1, Unmarshal giờ từ chối nhiều mã hóa số nguyên và độ dài không chuẩn.
  • Decoder của package encoding/base64 đã được sửa để xử lý các byte cuối cùng của đầu vào. Trước đây nó xử lý nhiều token bốn byte nhất có thể nhưng bỏ qua phần còn lại, tối đa ba byte. Do đó, Decoder hiện xử lý đúng các đầu vào trong mã hóa không có đệm (như RawURLEncoding), nhưng nó cũng từ chối các đầu vào trong mã hóa có đệm bị cắt ngắn hoặc kết thúc bằng các byte không hợp lệ, chẳng hạn như khoảng trắng ở cuối.
  • Package encoding/json giờ kiểm tra cú pháp của một Number trước khi marshal nó, yêu cầu nó tuân theo đặc tả JSON cho các giá trị số. Như trong các bản phát hành trước, Number bằng không (chuỗi rỗng) được marshal thành literal 0 (không).
  • Hàm Marshal của package encoding/xml giờ hỗ trợ thuộc tính cdata, tương tự như chardata nhưng mã hóa đối số của nó trong một hoặc nhiều tag <![CDATA[ ... ]]>.
  • Cũng trong package encoding/xml, phương thức Token của Decoder giờ báo cáo lỗi khi gặp EOF trước khi thấy tất cả các tag mở được đóng, nhất quán với yêu cầu chung của nó là các tag trong đầu vào phải được khớp đúng cách. Để tránh yêu cầu đó, sử dụng RawToken.
  • Package fmt giờ cho phép bất kỳ kiểu số nguyên nào làm đối số cho đặc tả chiều rộng và độ chính xác * của Printf. Trong các bản phát hành trước, đối số cho * được yêu cầu có kiểu int.
  • Cũng trong package fmt, Scanf giờ có thể quét chuỗi thập lục phân sử dụng %X, như một bí danh cho %x. Cả hai định dạng đều chấp nhận mọi kết hợp của thập lục phân chữ hoa và chữ thường.
  • Các package imageimage/color bổ sung kiểu NYCbCrANYCbCrA để hỗ trợ hình ảnh Y’CbCr với alpha không nhân trước.
  • Việc triển khai MultiWriter của package io giờ triển khai phương thức WriteString, để sử dụng bởi WriteString.
  • Trong package math/big, Int bổ sung AppendText để kiểm soát nhiều hơn việc in.
  • Cũng trong package math/big, Float giờ triển khai encoding.TextMarshalerencoding.TextUnmarshaler, cho phép nó được serialize theo dạng tự nhiên bởi các package encoding/jsonencoding/xml.
  • Cũng trong package math/big, phương thức Append của Float giờ hỗ trợ đối số độ chính xác đặc biệt -1. Như trong strconv.ParseFloat, độ chính xác -1 có nghĩa là sử dụng số chữ số nhỏ nhất cần thiết sao cho Parse đọc kết quả vào một Float có cùng độ chính xác sẽ mang lại giá trị ban đầu.
  • Package math/rand bổ sung hàm Read và tương tự Rand bổ sung phương thức Read. Điều này giúp tạo dữ liệu kiểm thử giả ngẫu nhiên dễ dàng hơn. Lưu ý rằng, giống như phần còn lại của package, các phương thức này không nên được sử dụng trong các ngữ cảnh mật mã; cho những mục đích đó, hãy sử dụng package crypto/rand.
  • Hàm ParseMAC của package net giờ chấp nhận địa chỉ lớp liên kết IP-over-InfiniBand (IPoIB) 20 byte.
  • Cũng trong package net, đã có một vài thay đổi đối với tra cứu DNS. Đầu tiên, triển khai lỗi DNSError giờ triển khai Error, và đặc biệt phương thức mới IsTemporary của nó trả về true cho các lỗi máy chủ DNS. Thứ hai, các hàm tra cứu DNS như LookupAddr giờ trả về tên miền có gốc (với dấu chấm ở cuối) trên Plan 9 và Windows, để khớp với hành vi của Go trên các hệ thống Unix.
  • Package net/http có một số bổ sung nhỏ ngoài hỗ trợ HTTP/2 đã được thảo luận. Đầu tiên, FileServer giờ sắp xếp các danh sách thư mục được tạo ra theo tên tệp. Thứ hai, hàm ServeFile giờ từ chối phục vụ kết quả nếu đường dẫn URL của yêu cầu chứa “..” (dấu chấm-chấm) là một phần tử đường dẫn. Các chương trình thường nên sử dụng FileServerDir thay vì gọi ServeFile trực tiếp. Các chương trình cần phục vụ nội dung tệp trong phản hồi cho các URL chứa dấu chấm-chấm vẫn có thể gọi ServeContent. Thứ ba, Client giờ cho phép mã người dùng đặt header Expect: 100-continue (xem Transport.ExpectContinueTimeout). Thứ tư, có năm mã lỗi mới: StatusPreconditionRequired (428), StatusTooManyRequests (429), StatusRequestHeaderFieldsTooLarge (431) và StatusNetworkAuthenticationRequired (511) từ RFC 6585, cũng như StatusUnavailableForLegalReasons (451) mới được phê duyệt gần đây. Thứ năm, việc triển khai và tài liệu hóa CloseNotifier đã được thay đổi đáng kể. Interface Hijacker giờ hoạt động đúng trên các kết nối đã được sử dụng trước đây với CloseNotifier. Tài liệu hiện mô tả khi nào CloseNotifier được mong đợi hoạt động.
  • Cũng trong package net/http, có một vài thay đổi liên quan đến việc xử lý một cấu trúc Request với trường Method của nó được đặt thành chuỗi rỗng. Trường Method rỗng luôn được ghi lại là bí danh cho "GET" và vẫn như vậy. Tuy nhiên, Go 1.6 sửa một vài routine không xử lý Method rỗng giống như "GET" tường minh. Đặc biệt, trong các bản phát hành trước Client theo dõi các chuyển hướng chỉ với Method được đặt tường minh thành "GET"; trong Go 1.6, Client cũng theo dõi các chuyển hướng cho Method rỗng. Cuối cùng, NewRequest chấp nhận một đối số method chưa được ghi lại là được phép rỗng. Trong các bản phát hành trước, truyền đối số method rỗng dẫn đến một Request với trường Method rỗng. Trong Go 1.6, kết quả Request luôn có trường Method được khởi tạo: nếu đối số của nó là chuỗi rỗng, NewRequest đặt trường Method trong Request được trả về thành "GET".
  • ResponseRecorder của package net/http/httptest giờ khởi tạo header Content-Type mặc định sử dụng cùng thuật toán phát hiện nội dung như trong http.Server.
  • Parse của package net/url giờ nghiêm ngặt hơn và tuân thủ đặc tả hơn đối với việc phân tích tên máy chủ. Ví dụ, khoảng trắng trong tên máy chủ không còn được chấp nhận.
  • Cũng trong package net/url, kiểu Error giờ triển khai net.Error.
  • Các hàm IsExist, IsNotExist, và IsPermission của package os giờ trả về kết quả đúng khi hỏi về một SyscallError.
  • Trên các hệ thống giống Unix, khi một lần ghi vào os.Stdout hoặc os.Stderr (chính xác hơn là một os.File được mở cho file descriptor 1 hoặc 2) thất bại do lỗi broken pipe, chương trình sẽ phát tín hiệu SIGPIPE. Theo mặc định, điều này sẽ khiến chương trình thoát; điều này có thể được thay đổi bằng cách gọi hàm Notify của package os/signal cho syscall.SIGPIPE. Một lần ghi vào broken pipe trên file descriptor khác 1 hoặc 2 sẽ đơn giản trả về syscall.EPIPE (có thể được bọc trong os.PathError và/hoặc os.SyscallError) cho người gọi. Hành vi cũ của việc phát tín hiệu SIGPIPE không thể bắt sau 10 lần ghi liên tiếp vào broken pipe không còn xảy ra nữa.
  • Trong package os/exec, phương thức Output của Cmd tiếp tục trả về một ExitError khi lệnh thoát với trạng thái không thành công. Nếu lỗi chuẩn bị bị bỏ qua, ExitError được trả về giờ chứa tiền tố và hậu tố (hiện tại là 32 kB) của đầu ra lỗi chuẩn của lệnh thất bại, để gỡ lỗi hoặc đưa vào thông báo lỗi. Phương thức String của ExitError không hiển thị lỗi chuẩn đã chụp; các chương trình phải truy xuất nó từ cấu trúc dữ liệu một cách riêng biệt.
  • Trên Windows, hàm Join của package path/filepath giờ xử lý đúng trường hợp khi base là đường dẫn drive tương đối. Ví dụ, Join(`c:`, `a`) giờ trả về `c:a` thay vì `c:\a` như trong các bản phát hành trước. Điều này có thể ảnh hưởng đến mã mong đợi kết quả không chính xác.
  • Trong package regexp, kiểu Regexp luôn an toàn để sử dụng bởi các goroutine đồng thời. Nó sử dụng một sync.Mutex để bảo vệ bộ nhớ cache của các không gian tạm thời được sử dụng trong quá trình tìm kiếm biểu thức chính quy. Một số server có nhiều đồng thời sử dụng cùng Regexp từ nhiều goroutine đã thấy hiệu suất giảm do tranh chấp trên mutex đó. Để giúp các server đó, Regexp giờ có phương thức Copy, tạo một bản sao của Regexp chia sẻ hầu hết cấu trúc của bản gốc nhưng có không gian cache tạm thời riêng. Hai goroutine có thể sử dụng các bản sao khác nhau của Regexp mà không có tranh chấp mutex. Một bản sao có thêm chi phí không gian, vì vậy Copy chỉ nên được sử dụng khi đã quan sát thấy tranh chấp.
  • Package strconv bổ sung IsGraphic, tương tự như IsPrint. Nó cũng bổ sung QuoteToGraphic, QuoteRuneToGraphic, AppendQuoteToGraphic, và AppendQuoteRuneToGraphic, tương tự như QuoteToASCII, QuoteRuneToASCII, và các hàm tương tự. Họ ASCII thoát tất cả các ký tự khoảng trắng ngoại trừ khoảng trắng ASCII (U+0020). Ngược lại, họ Graphic không thoát bất kỳ ký tự khoảng trắng Unicode nào (danh mục Zs).
  • Trong package testing, khi một test gọi t.Parallel, test đó bị tạm dừng cho đến khi tất cả các test không song song hoàn thành, và sau đó test đó tiếp tục thực thi cùng với tất cả các test song song khác. Go 1.6 thay đổi thời gian được báo cáo cho test đó: trước đây, thời gian chỉ tính phần thực thi song song, nhưng bây giờ nó cũng tính thời gian từ khi bắt đầu kiểm thử đến lời gọi t.Parallel.
  • Package text/template chứa hai thay đổi nhỏ, ngoài các thay đổi lớn được mô tả ở trên. Đầu tiên, nó thêm kiểu ExecError mới được trả về cho bất kỳ lỗi nào trong quá trình Execute không xuất phát từ Write đến writer bên dưới. Người gọi có thể phân biệt lỗi sử dụng template với lỗi I/O bằng cách kiểm tra ExecError. Thứ hai, phương thức Funcs giờ kiểm tra rằng các tên được sử dụng làm khóa trong FuncMap là các định danh có thể xuất hiện trong một lời gọi hàm template. Nếu không, Funcs sẽ panic.
  • Hàm Parse của package time luôn từ chối bất kỳ ngày trong tháng nào lớn hơn 31, chẳng hạn như ngày 32 tháng 1. Trong Go 1.6, Parse giờ cũng từ chối ngày 29 tháng 2 trong các năm không nhuận, ngày 30, 31 tháng 2, ngày 31 tháng 4, ngày 31 tháng 6, ngày 31 tháng 9 và ngày 31 tháng 11.