Ghi chú phát hành Go 1.8

Giới thiệu về Go 1.8

Bản phát hành Go mới nhất, phiên bản 1.8, ra đời sáu tháng sau Go 1.7. Phần lớn các thay đổi nằm ở phần triển khai bộ công cụ, runtime và các thư viện. Có hai thay đổi nhỏ đố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 hỗ trợ cho MIPS 32-bit, cập nhật backend trình biên dịch để tạo mã hiệu quả hơn, giảm thời gian tạm dừng GC bằng cách loại bỏ quét stack stop-the-world, bổ sung hỗ trợ HTTP/2 Push, bổ sung tắt nhẹ nhàng HTTP, bổ sung hỗ trợ context nhiều hơn, cho phép profiling mutex, và đơn giản hóa sắp xếp slice.

Thay đổi về ngôn ngữ

Khi chuyển đổi tường minh một giá trị từ kiểu struct này sang kiểu struct khác, từ Go 1.8 các tag bị bỏ qua. Do đó, hai struct chỉ khác nhau về tag có thể được chuyển đổi từ cái này sang cái kia:

func example() {
    type T1 struct {
        X int `json:"foo"`
    }
    type T2 struct {
        X int `json:"bar"`
    }
    var v1 T1
    var v2 T2
    v1 = T1(v2) // hợp lệ từ bây giờ
}

Đặc tả ngôn ngữ giờ chỉ yêu cầu các triển khai hỗ trợ tối đa số mũ 16-bit trong các hằng số dấu phẩy động. Điều này không ảnh hưởng đến cả trình biên dịch “gc” hay trình biên dịch gccgo, cả hai vẫn hỗ trợ số mũ 32-bit.

Các port

Go giờ hỗ trợ MIPS 32-bit trên Linux cho cả máy big-endian (linux/mips) và little-endian (linux/mipsle) triển khai tập lệnh MIPS32r1 với FPU hoặc mô phỏng FPU kernel. Lưu ý rằng nhiều bộ định tuyến dựa trên MIPS phổ biến không có FPU và có firmware không bật mô phỏng FPU kernel; Go sẽ không chạy trên các máy đó.

Trên DragonFly BSD, Go giờ yêu cầu DragonFly 4.4.4 hoặc mới hơn.

Trên OpenBSD, Go giờ yêu cầu OpenBSD 5.9 hoặc mới hơn.

Hỗ trợ mạng của port Plan 9 giờ đầy đủ hơn nhiều và khớp với hành vi của Unix và Windows về deadline và hủy. Về yêu cầu kernel Plan 9, xem trang wiki Plan 9.

Go 1.8 giờ chỉ hỗ trợ OS X 10.8 hoặc mới hơn. Đây có thể là bản phát hành Go cuối cùng hỗ trợ 10.8. Việc biên dịch Go hoặc chạy các tệp nhị phân trên các phiên bản OS X cũ hơn chưa được kiểm thử.

Go 1.8 sẽ là bản phát hành cuối cùng hỗ trợ Linux trên bộ xử lý ARMv5E và ARMv6: Go 1.9 có thể sẽ yêu cầu ARMv6K (như được tìm thấy trong Raspberry Pi 1) hoặc mới hơn. Để xác định xem một hệ thống Linux có phải ARMv6K hay mới hơn hay không, chạy “go tool dist -check-armv6k” (để tạo điều kiện kiểm thử, cũng có thể chỉ sao chép lệnh dist sang hệ thống mà không cần cài đặt bản sao đầy đủ của Go 1.8) và nếu chương trình kết thúc với đầu ra “ARMv6K supported.” thì hệ thống triển khai ARMv6K hoặc mới hơn. Go trên các hệ thống ARM không phải Linux đã yêu cầu ARMv6K hoặc mới hơn.

zos giờ là giá trị được nhận dạng cho GOOS, được dành riêng cho hệ điều hành z/OS.

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

Có một số bất ổn trên FreeBSD và NetBSD đã biết nhưng chưa được hiểu rõ. Điều này có thể dẫn đến crash chương trình trong các trường hợp hiếm gặp. Xem issue 15658issue 16511. Mọi sự giúp đỡ trong việc giải quyết các vấn đề này đều được hoan nghênh.

Công cụ

Assembler

Đối với các hệ thống x86 64-bit, các lệnh sau đã được thêm vào: VBROADCASTSD, BROADCASTSS, MOVDDUP, MOVSHDUP, MOVSLDUP, VMOVDDUP, VMOVSHDUP, và VMOVSLDUP.

Đối với các hệ thống PPC 64-bit, các lệnh scalar vector chung đã được thêm vào: LXS, LXSDX, LXSI, LXSIWAX, LXSIWZX, LXV, LXVD2X, LXVDSX, LXVW4X, MFVSR, MFVSRD, MFVSRWZ, MTVSR, MTVSRD, MTVSRWA, MTVSRWZ, STXS, STXSDX, STXSI, STXSIWX, STXV, STXVD2X, STXVW4X, XSCV, XSCVDPSP, XSCVDPSPN, XSCVDPSXDS, XSCVDPSXWS, XSCVDPUXDS, XSCVDPUXWS, XSCVSPDP, XSCVSPDPN, XSCVSXDDP, XSCVSXDSP, XSCVUXDDP, XSCVUXDSP, XSCVX, XSCVXP, XVCV, XVCVDPSP, XVCVDPSXDS, XVCVDPSXWS, XVCVDPUXDS, XVCVDPUXWS, XVCVSPDP, XVCVSPSXDS, XVCVSPSXWS, XVCVSPUXDS, XVCVSPUXWS, XVCVSXDDP, XVCVSXDSP, XVCVSXWDP, XVCVSXWSP, XVCVUXDDP, XVCVUXDSP, XVCVUXWDP, XVCVUXWSP, XVCVX, XVCVXP, XXLAND, XXLANDC, XXLANDQ, XXLEQV, XXLNAND, XXLNOR, XXLOR, XXLORC, XXLORQ, XXLXOR, XXMRG, XXMRGHW, XXMRGLW, XXPERM, XXPERMDI, XXSEL, XXSI, XXSLDWI, XXSPLT, và XXSPLTW.

Yacc

Công cụ yacc (trước đây có sẵn bằng cách chạy “go tool yacc”) đã bị loại bỏ. Từ Go 1.7, nó không còn được sử dụng bởi trình biên dịch Go. Nó đã được chuyển sang kho “tools” và hiện có sẵn tại golang.org/x/tools/cmd/goyacc.

Fix

Công cụ fix có sửa chữa “context” mới để thay đổi các import từ “golang.org/x/net/context” thành “context”.

Pprof

Công cụ pprof giờ có thể profile các server TLS và bỏ qua xác thực chứng chỉ bằng cách sử dụng lược đồ URL “https+insecure”.

Đầu ra callgrind giờ có độ chi tiết cấp lệnh.

Trace

Công cụ trace có cờ mới -pprof để tạo ra các profile blocking và latency tương thích với pprof từ một execution trace.

Các sự kiện thu gom rác giờ được hiển thị rõ ràng hơn trong trình xem execution trace. Hoạt động thu gom rác được hiển thị trên hàng riêng của nó và các goroutine GC helper được chú thích với vai trò của chúng.

Vet

Vet nghiêm ngặt hơn theo một số cách và ít nghiêm ngặt hơn ở những nơi trước đây gây ra dương tính giả.

Vet giờ kiểm tra việc sao chép mảng khóa, các tag struct JSON và XML trùng lặp, các tag struct không phân cách bằng khoảng trắng, các lời gọi trì hoãn đến Response.Body.Close của HTTP trước khi kiểm tra lỗi, và các đối số được đánh chỉ mục trong Printf. Nó cũng cải thiện các kiểm tra hiện có.

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

Go 1.7 đã giới thiệu một backend trình biên dịch mới cho các hệ thống x86 64-bit. Trong Go 1.8, backend đó đã được phát triển thêm và giờ được sử dụng cho tất cả kiến trúc.

Backend mới, dựa trên dạng gán đơn tĩnh (SSA), tạo ra mã nhỏ gọn, hiệu quả hơn và cung cấp nền tảng tốt hơn cho các tối ưu hóa như loại bỏ kiểm tra giới hạn. Backend mới giảm thời gian CPU cần thiết bởi các chương trình benchmark của chúng tôi từ 20-30% trên các hệ thống ARM 32-bit. Đối với các hệ thống x86 64-bit, vốn đã sử dụng backend SSA trong Go 1.7, mức tăng khiêm tốn hơn là 0-10%. Các kiến trúc khác có thể sẽ thấy các cải tiến gần hơn với con số ARM 32-bit.

Cờ trình biên dịch -ssa=0 tạm thời được giới thiệu trong Go 1.7 để tắt backend mới đã bị loại bỏ trong Go 1.8.

Ngoài việc bật backend trình biên dịch mới cho tất cả hệ thống, Go 1.8 cũng giới thiệu một frontend trình biên dịch mới. Frontend trình biên dịch mới sẽ không được người dùng chú ý nhưng là nền tảng cho các công việc hiệu suất trong tương lai.

Trình biên dịch và trình liên kết đã được tối ưu hóa và chạy nhanh hơn trong bản phát hành này so với Go 1.7, mặc dù chúng vẫn chậm hơn mức mong muốn và sẽ tiếp tục được tối ưu hóa trong các bản phát hành tương lai. So với bản phát hành trước, Go 1.8 nhanh hơn khoảng 15%.

Cgo

Công cụ Go giờ ghi nhớ giá trị của biến môi trường CGO_ENABLED được đặt trong quá trình make.bash và áp dụng nó cho tất cả các lần biên dịch trong tương lai theo mặc định để sửa issue #12808. Khi thực hiện biên dịch native, hiếm khi cần đặt tường minh biến môi trường CGO_ENABLEDmake.bash sẽ phát hiện cài đặt đúng tự động. Lý do chính để đặt tường minh biến môi trường CGO_ENABLED là khi môi trường của bạn hỗ trợ cgo, nhưng bạn tường minh không muốn hỗ trợ cgo, trong trường hợp đó, đặt CGO_ENABLED=0 trong quá trình make.bash hoặc all.bash.

Biến môi trường PKG_CONFIG giờ có thể được sử dụng để đặt chương trình chạy để xử lý các chỉ thị #cgo pkg-config. Giá trị mặc định là pkg-config, chương trình luôn được sử dụng bởi các bản phát hành trước. Điều này nhằm giúp việc cross-compile mã cgo dễ dàng hơn.

Công cụ cgo giờ hỗ trợ tùy chọn -srcdir, được sử dụng bởi lệnh go.

Nếu mã cgo gọi C.malloc, và malloc trả về NULL, chương trình sẽ crash với lỗi hết bộ nhớ. C.malloc sẽ không bao giờ trả về nil. Không giống như hầu hết các hàm C, C.malloc không thể được sử dụng trong dạng hai kết quả trả về giá trị errno.

Nếu mã cgo gọi một hàm C truyền con trỏ đến một C union, và nếu C union có thể chứa bất kỳ giá trị con trỏ nào, và nếu kiểm tra con trỏ cgo được bật (như theo mặc định), giá trị union giờ được kiểm tra cho các con trỏ Go.

Gccgo

Do sự căn chỉnh lịch phát hành sáu tháng 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 6 chứa phiên bản Go 1.6.1 của gccgo. Chúng tôi kỳ vọng bản phát hành tiếp theo, GCC 7, sẽ chứa phiên bản Go 1.8 của gccgo.

GOPATH mặc định

Biến môi trường GOPATH giờ có giá trị mặc định nếu nó không được đặt. Nó mặc định là $HOME/go trên Unix và %USERPROFILE%/go trên Windows.

Go get

Lệnh “go get” giờ luôn tôn trọng các biến môi trường proxy HTTP, bất kể cờ -insecure có được sử dụng hay không. Trong các bản phát hành trước, cờ -insecure có tác dụng phụ là không sử dụng proxy.

Go bug

Lệnh mới “go bug” bắt đầu một báo cáo lỗi trên GitHub, được điền sẵn với thông tin về hệ thống hiện tại.

Go doc

Lệnh “go doc” giờ nhóm các hằng số và biến với kiểu của chúng, theo hành vi của godoc.

Để cải thiện tính dễ đọc của đầu ra doc, mỗi tóm tắt của các mục cấp đầu được đảm bảo chiếm một dòng.

Tài liệu cho một phương thức cụ thể trong định nghĩa interface giờ có thể được yêu cầu, như trong “go doc net.Conn.SetDeadline”.

Plugins

Go giờ cung cấp hỗ trợ sơ bộ cho plugin với chế độ build “plugin” để tạo ra các plugin viết bằng Go, và một package plugin mới để tải các plugin đó trong thời gian chạy. Hỗ trợ plugin hiện chỉ có sẵn trên Linux. Vui lòng báo cáo bất kỳ vấn đề nào.

Runtime

Thời gian sống của đối số

Bộ gom rác không còn coi các đối số là sống trong suốt toàn bộ hàm. Để biết thêm thông tin, và cách buộc một biến vẫn sống, xem hàm runtime.KeepAlive được thêm vào trong Go 1.7.

Cập nhật: Mã đặt finalizer trên một đối tượng được cấp phát có thể cần thêm các lời gọi đến runtime.KeepAlive trong các hàm hoặc phương thức sử dụng đối tượng đó. Đọc tài liệu KeepAlive và ví dụ của nó để biết thêm chi tiết.

Sử dụng sai Map đồng thời

Trong Go 1.6, runtime đã thêm 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. Bản phát hành này cải thiện bộ phát hiện đó với hỗ trợ để phát hiện các chương trình viết vào và lặp qua map đồng thời.

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 (bao gồm cả lặp) 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.

Tài liệu MemStats

Kiểu runtime.MemStats đã được ghi lại đầy đủ hơn.

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. Hầu hết các chương trình nên chạy nhanh hơn một chút, do tăng tốc trong bộ gom rác và các tối ưu hóa trong thư viện chuẩn.

Đã có các tối ưu hóa cho các triển khai trong các package bytes, crypto/aes, crypto/cipher, crypto/elliptic, crypto/sha256, crypto/sha512, encoding/asn1, encoding/csv, encoding/hex, encoding/json, hash/crc32, image/color, image/draw, math, math/big, reflect, regexp, runtime, strconv, strings, syscall, text/templateunicode/utf8.

Bộ gom rác

Thời gian tạm dừng của bộ gom rác nên ngắn hơn đáng kể so với Go 1.7, thường dưới 100 micro giây và thường thấp tới 10 micro giây. Xem tài liệu về việc loại bỏ quét stack stop-the-world để biết chi tiết. Vẫn còn nhiều công việc cho Go 1.9.

Defer

Chi phí của các lời gọi hàm trì hoãn đã giảm khoảng một nửa.

Cgo

Chi phí của các lời gọi từ Go vào C đã giảm khoảng một nửa.

Thư viện chuẩn

Ví dụ

Các ví dụ đã được thêm vào tài liệu trên nhiều package.

Sort

Package sort giờ bao gồm một hàm tiện lợi Slice để sắp xếp một slice cho hàm less đã cho. Trong nhiều trường hợp, điều này có nghĩa là không cần thiết phải viết một kiểu sorter mới.

Cũng có mới là SliceStableSliceIsSorted.

HTTP/2 Push

Package net/http giờ bao gồm một cơ chế để gửi các HTTP/2 server push từ một Handler. Tương tự như các interface FlusherHijacker hiện có, một ResponseWriter HTTP/2 giờ triển khai interface Pusher mới.

Tắt nhẹ nhàng HTTP Server

HTTP Server giờ có hỗ trợ tắt nhẹ nhàng bằng phương thức mới Server.Shutdown và tắt đột ngột bằng phương thức mới Server.Close.

Hỗ trợ Context nhiều hơn

Tiếp tục việc áp dụng của Go 1.7 context.Context vào thư viện chuẩn, Go 1.8 bổ sung nhiều hỗ trợ context hơn vào các package hiện có:

Profiling tranh chấp Mutex

Runtime và các công cụ giờ hỗ trợ profiling các mutex tranh chấp.

Hầu hết người dùng sẽ muốn sử dụng cờ -mutexprofile mới với “go test”, và sau đó sử dụng pprof trên tệp kết quả.

Hỗ trợ cấp thấp hơn cũng có sẵn thông qua MutexProfileSetMutexProfileFraction mới.

Một hạn chế đã biết cho Go 1.8 là profile chỉ báo cáo tranh chấp cho sync.Mutex, không phải sync.RWMutex.

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

Như thường lệ, có nhiều thay đổi và cập nhật nhỏ cho 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í. Các phần sau liệt kê các thay đổi và bổ sung có thể nhìn thấy với người dùng. Các tối ưu hóa và sửa lỗi nhỏ không được liệt kê.

archive/tar

Việc triển khai tar sửa nhiều lỗi trong các trường hợp góc cạnh của định dạng tệp. Reader giờ có thể xử lý các tệp tar ở định dạng PAX với các mục lớn hơn 8GB. Writer không còn tạo ra các tệp tar không hợp lệ trong một số tình huống liên quan đến tên đường dẫn dài.

compress/flate

Đã có một số sửa chữa nhỏ cho encoder để cải thiện tỷ lệ nén trong một số tình huống. Do đó, đầu ra mã hóa chính xác của DEFLATE có thể khác với Go 1.7. Vì DEFLATE là nén bên dưới của gzip, png, zlib và zip, các định dạng đó có thể có đầu ra đã thay đổi.

Encoder, khi hoạt động ở chế độ NoCompression, giờ tạo ra đầu ra nhất quán không phụ thuộc vào kích thước của các slice được truyền cho phương thức Write.

Bộ giải mã, khi gặp lỗi, giờ trả về bất kỳ dữ liệu đã giải nén nào nó có cùng với lỗi.

compress/gzip

Writer giờ mã hóa trường MTIME bằng không khi trường Header.ModTime là giá trị không. Trong các bản phát hành Go trước, Writer sẽ mã hóa một giá trị vô nghĩa. Tương tự, Reader giờ báo cáo trường MTIME được mã hóa bằng không là một Header.ModTime bằng không.

context

Lỗi DeadlineExceeded giờ triển khai net.Error và báo cáo true cho cả hai phương thức TimeoutTemporary.

crypto/tls

Phương thức mới Conn.CloseWrite cho phép các kết nối TLS đóng một nửa.

Phương thức mới Config.Clone sao chép một cấu hình TLS.

Callback mới Config.GetConfigForClient cho phép chọn cấu hình cho client một cách động, dựa trên ClientHelloInfo của client. Struct ClientHelloInfo giờ có các trường mới Conn, SignatureSchemes (sử dụng kiểu mới SignatureScheme), SupportedProtosSupportedVersions.

Callback mới Config.GetClientCertificate cho phép chọn chứng chỉ client dựa trên thông điệp TLS CertificateRequest của server, được biểu diễn bởi CertificateRequestInfo mới.

Config.KeyLogWriter mới cho phép gỡ lỗi các kết nối TLS trong WireShark và các công cụ tương tự.

Callback mới Config.VerifyPeerCertificate cho phép xác thực bổ sung của chứng chỉ được trình bày của peer.

Package crypto/tls giờ triển khai các biện pháp đối phó cơ bản chống lại các oracle đệm CBC. Không nên có các thời gian phụ thuộc bí mật tường minh, nhưng nó không cố gắng chuẩn hóa các lần truy cập bộ nhớ để ngăn rò rỉ thời gian cache.

Package crypto/tls giờ hỗ trợ X25519 và ChaCha20-Poly1305. ChaCha20-Poly1305 giờ được ưu tiên trừ khi hỗ trợ phần cứng cho AES-GCM có mặt.

Các bộ mã hóa AES-128-CBC với SHA-256 cũng giờ được hỗ trợ, nhưng bị tắt theo mặc định.

crypto/x509

Các chữ ký PSS giờ được hỗ trợ.

UnknownAuthorityError giờ có trường Cert, báo cáo chứng chỉ không đáng tin cậy.

Xác thực chứng chỉ có nhiều quyền hạn hơn trong một số trường hợp và nghiêm ngặt hơn trong một số trường hợp khác.

Chứng chỉ root giờ cũng được tìm kiếm tại /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem trên Linux, để hỗ trợ RHEL và CentOS.

database/sql

Package giờ hỗ trợ context.Context. Có các phương thức mới kết thúc bằng Context như DB.QueryContextDB.PrepareContext nhận các đối số context. Sử dụng các phương thức Context mới đảm bảo rằng các kết nối được đóng và trả về pool kết nối khi yêu cầu hoàn thành; cho phép hủy các truy vấn đang tiến hành nếu driver hỗ trợ điều đó; và cho phép pool cơ sở dữ liệu hủy việc chờ đợi kết nối tiếp theo có sẵn.

IsolationLevel giờ có thể được đặt khi bắt đầu một giao dịch bằng cách đặt mức độ cô lập trên TxOptions.Isolation và truyền nó cho DB.BeginTx. Một lỗi sẽ được trả về nếu chọn một mức độ cô lập mà driver không hỗ trợ. Thuộc tính chỉ đọc cũng có thể được đặt trên giao dịch bằng cách đặt TxOptions.ReadOnly thành true.

Các truy vấn giờ hiển thị thông tin kiểu cột SQL cho các driver hỗ trợ. Rows có thể trả về ColumnTypes có thể bao gồm thông tin kiểu SQL, độ dài kiểu cột và kiểu Go.

Rows giờ có thể biểu diễn nhiều tập kết quả. Sau khi Rows.Next trả về false, Rows.NextResultSet có thể được gọi để chuyển sang tập kết quả tiếp theo. Rows hiện có nên tiếp tục được sử dụng sau khi nó chuyển sang tập kết quả tiếp theo.

NamedArg có thể được sử dụng làm đối số truy vấn. Hàm mới Named giúp tạo NamedArg ngắn gọn hơn.

Nếu một driver hỗ trợ interface Pinger mới, các phương thức DB.PingDB.PingContext sẽ sử dụng interface đó để kiểm tra xem kết nối cơ sở dữ liệu còn hợp lệ không.

Các phương thức truy vấn Context mới hoạt động cho tất cả driver, nhưng việc hủy Context không phản hồi trừ khi driver đã được cập nhật để sử dụng chúng. Các tính năng khác yêu cầu hỗ trợ driver trong database/sql/driver. Tác giả driver nên xem xét các interface mới. Người dùng driver hiện có nên xem tài liệu driver để xem nó hỗ trợ gì và tài liệu cụ thể cho hệ thống về mỗi tính năng.

debug/pe

Package đã được mở rộng và giờ được sử dụng bởi trình liên kết Go để đọc các tệp đối tượng do gcc tạo ra. File.StringTableSection.Relocs mới cung cấp quyền truy cập vào bảng chuỗi COFF và các relocation COFF. File.COFFSymbols mới cho phép truy cập cấp thấp vào bảng ký hiệu COFF.

encoding/base64

Phương thức Encoding.Strict mới trả về một Encoding khiến bộ giải mã trả về lỗi khi các bit đệm ở cuối không phải bằng không.

encoding/binary

ReadWrite giờ hỗ trợ boolean.

encoding/json

UnmarshalTypeError giờ bao gồm tên struct và trường.

Một Marshaler nil giờ marshal thành giá trị JSON null.

Một giá trị RawMessage giờ marshal giống như kiểu con trỏ của nó.

Marshal mã hóa các số dấu phẩy động sử dụng cùng định dạng như trong ES6, ưu tiên ký hiệu thập phân (không phải mũ) cho phạm vi giá trị rộng hơn. Đặc biệt, tất cả các số nguyên dấu phẩy động tới 264 định dạng giống như biểu diễn int64 tương đương.

Trong các phiên bản Go trước, việc unmarshal JSON null vào một Unmarshaler được coi là no-op; giờ phương thức UnmarshalJSON của Unmarshaler được gọi với literal JSON null và có thể định nghĩa ngữ nghĩa của trường hợp đó.

encoding/pem

Decode giờ nghiêm ngặt về định dạng của dòng kết thúc.

encoding/xml

Unmarshal giờ có hỗ trợ wildcard để thu thập tất cả thuộc tính bằng cách sử dụng tag struct ",any,attr" mới.

expvar

Các phương thức mới Int.Value, String.Value, Float.ValueFunc.Value báo cáo giá trị hiện tại của một biến được xuất khẩu.

Hàm mới Handler trả về trình xử lý HTTP của package, để bật việc cài đặt nó ở các vị trí không chuẩn.

fmt

Scanf, FscanfSscanf giờ xử lý khoảng trắng khác nhau và nhất quán hơn so với các bản phát hành trước. Xem tài liệu quét để biết chi tiết.

go/doc

Hàm mới IsPredeclared báo cáo liệu một chuỗi có phải là định danh được định nghĩa sẵn hay không.

go/types

Hàm mới Default trả về kiểu “có kiểu” mặc định cho một kiểu “không có kiểu”.

Căn chỉnh của complex64 giờ khớp với trình biên dịch Go.

html/template

Package giờ xác thực thuộc tính "type" trên tag <script>.

image/png

Decode (và DecodeConfig) giờ hỗ trợ độ trong suốt True Color và grayscale.

Encoder giờ nhanh hơn và tạo ra đầu ra nhỏ hơn khi mã hóa hình ảnh được phân bảng màu.

math/big

Phương thức mới Int.Sqrt tính ⌊√x⌋.

Phương thức mới Float.Scan là một routine hỗ trợ cho fmt.Scanner.

Int.ModInverse giờ hỗ trợ các số âm.

math/rand

Phương thức mới Rand.Uint64 trả về các giá trị uint64. Interface Source64 mới mô tả các nguồn có khả năng tạo ra các giá trị đó trực tiếp; nếu không, phương thức Rand.Uint64 xây dựng uint64 từ hai lời gọi đến phương thức Int63 của Source.

mime

ParseMediaType giờ bảo tồn các thoát backslash không cần thiết như các literal, để hỗ trợ MSIE. Khi MSIE gửi đường dẫn tệp đầy đủ (trong “chế độ intranet”), nó không thoát backslash: “C:\dev\go\foo.txt”, không phải “C:\\dev\\go\\foo.txt”. Nếu chúng ta thấy một thoát backslash không cần thiết, chúng ta giờ giả định nó từ MSIE và được dùng như backslash literal. Không có generator MIME đã biết nào phát ra các thoát backslash không cần thiết cho các ký tự token đơn giản như số và chữ cái.

mime/quotedprintable

Việc phân tích của Reader đã được nới lỏng theo hai cách để chấp nhận nhiều đầu vào thấy trong thực tế hơn. Đầu tiên, nó chấp nhận dấu bằng (=) không theo sau bởi hai chữ số hex là một dấu bằng literal. Thứ hai, nó im lặng bỏ qua dấu bằng ở cuối của đầu vào được mã hóa.

net

Tài liệu của Conn đã được cập nhật để làm rõ kỳ vọng của việc triển khai interface. Các cập nhật trong các package net/http phụ thuộc vào các triển khai tuân theo tài liệu.

Cập nhật: các triển khai của interface Conn nên xác minh chúng triển khai ngữ nghĩa đã ghi lại. Package golang.org/x/net/nettest sẽ kiểm thử một Conn và xác thực nó hoạt động đúng cách.

Phương thức mới UnixListener.SetUnlinkOnClose đặt xem tệp socket bên dưới có nên bị xóa khỏi hệ thống tệp khi listener được đóng hay không.

Kiểu mới Buffers cho phép ghi vào mạng hiệu quả hơn từ nhiều buffer không liền kề trong bộ nhớ. Trên một số máy, đối với một số loại kết nối nhất định, điều này được tối ưu hóa thành một hoạt động ghi batch dành riêng cho OS (như writev).

Resolver mới tìm kiếm tên và số và hỗ trợ context.Context. Dialer giờ có trường Resolver tùy chọn.

Interfaces giờ được hỗ trợ trên Solaris.

Bộ giải quyết DNS Go giờ hỗ trợ các tùy chọn “rotate” và “option ndots:0” của resolv.conf. Tùy chọn “ndots” giờ được tôn trọng theo cùng cách như libresolve.

net/http

Thay đổi server:

  • Server giờ hỗ trợ tắt nhẹ nhàng, được đề cập ở trên.
  • Server thêm các tùy chọn cấu hình ReadHeaderTimeoutIdleTimeout và ghi lại WriteTimeout.
  • FileServerServeContent giờ hỗ trợ các yêu cầu điều kiện HTTP If-Match, ngoài hỗ trợ If-None-Match trước đây cho các ETag được định dạng đúng theo RFC 7232, phần 2.3.

Có một số bổ sung cho những gì Handler của server có thể làm:

  • Context được trả về bởi Request.Context bị hủy nếu net.Conn bên dưới đóng. Ví dụ, nếu người dùng đóng trình duyệt của họ trong giữa một yêu cầu chậm, Handler giờ có thể phát hiện rằng người dùng đã đi. Điều này bổ sung cho hỗ trợ CloseNotifier hiện có. Chức năng này yêu cầu rằng net.Conn bên dưới triển khai tài liệu interface được làm rõ gần đây.
  • Để phục vụ các trailer được tạo ra sau khi header đã được ghi, xem cơ chế TrailerPrefix mới.
  • Handler giờ có thể hủy bỏ một phản hồi bằng cách panic với lỗi ErrAbortHandler.
  • Write bằng không byte đến một ResponseWriter giờ được định nghĩa là một cách để kiểm tra xem ResponseWriter có bị hijack hay không: nếu có, Write trả về ErrHijacked mà không in lỗi vào log lỗi của server.

Thay đổi Client & Transport:

  • Client giờ sao chép hầu hết các header yêu cầu khi chuyển hướng. Xem tài liệu về kiểu Client để biết chi tiết.
  • Transport giờ hỗ trợ tên miền quốc tế. Do đó, Get và các helper khác cũng vậy.
  • Client giờ hỗ trợ chuyển hướng 301, 307 và 308. Ví dụ, Client.Post giờ theo dõi các chuyển hướng 301, chuyển đổi chúng thành các yêu cầu GET không có thân, giống như nó đã làm cho các phản hồi chuyển hướng 302 và 303 trước đây. Client giờ cũng theo dõi các chuyển hướng 307 và 308, giữ nguyên phương thức yêu cầu gốc và thân, nếu có. Nếu việc chuyển hướng yêu cầu gửi lại thân yêu cầu, yêu cầu phải có trường Request.GetBody mới được định nghĩa. NewRequest đặt Request.GetBody tự động cho các kiểu thân phổ biến.
  • Transport giờ từ chối các yêu cầu cho các URL với các port chứa ký tự không phải chữ số.
  • Transport giờ sẽ thử lại các yêu cầu không idempotent nếu không có byte nào được ghi trước khi mạng lỗi và yêu cầu không có thân.
  • Transport.ProxyConnectHeader mới cho phép cấu hình các giá trị header để gửi đến proxy trong một yêu cầu CONNECT.
  • DefaultTransport.Dialer giờ bật hỗ trợ DualStack ("Happy Eyeballs"), cho phép sử dụng IPv4 như backup nếu có vẻ như IPv6 có thể thất bại.
  • Transport không còn đọc một byte của Request.Body không nil khi Request.ContentLength bằng không để xác định xem ContentLength thực sự bằng không hay chỉ không xác định. Để tường minh báo hiệu rằng thân có độ dài bằng không, hoặc đặt nó thành nil, hoặc đặt nó thành giá trị mới NoBody. Giá trị NoBody mới được dùng bởi các hàm constructor Request; nó được sử dụng bởi NewRequest.

net/http/httptrace

Giờ có hỗ trợ để theo dõi quá trình bắt tay TLS của yêu cầu client với ClientTrace.TLSHandshakeStartClientTrace.TLSHandshakeDone mới.

net/http/httputil

ReverseProxy có hook tùy chọn mới, ModifyResponse, để sửa đổi phản hồi từ backend trước khi proxy nó đến client.

net/mail

Các chuỗi được trích dẫn rỗng lại được cho phép trong phần tên của địa chỉ. Nghĩa là, Go 1.4 và trước đây chấp nhận "" <[email protected]>, nhưng Go 1.5 đã giới thiệu một lỗi từ chối địa chỉ này. Địa chỉ lại được nhận dạng.

Phương thức Header.Date luôn cung cấp một cách để phân tích header Date:. Hàm mới ParseDate cho phép phân tích ngày được tìm thấy trong các dòng header khác, như header Resent-Date:.

net/smtp

Nếu việc triển khai phương thức Auth.Start trả về giá trị toServer rỗng, package không còn gửi khoảng trắng ở cuối trong lệnh SMTP AUTH, mà một số server từ chối.

net/url

Các hàm mới PathEscapePathUnescape tương tự như các hàm thoát và bỏ thoát truy vấn nhưng cho các phần tử đường dẫn.

Các phương thức mới URL.HostnameURL.Port trả về các trường tên máy chủ và port của URL, xử lý đúng trường hợp port có thể không có mặt.

Phương thức hiện có URL.ResolveReference giờ xử lý đúng các đường dẫn với các byte được thoát mà không mất ký tự thoát.

Kiểu URL giờ triển khai encoding.BinaryMarshalerencoding.BinaryUnmarshaler, cho phép xử lý URL trong dữ liệu gob.

Theo RFC 3986, Parse giờ từ chối các URL như this_that:other/thing thay vì diễn giải chúng là các đường dẫn tương đối (this_that không phải là lược đồ hợp lệ). Để buộc diễn giải là đường dẫn tương đối, các URL đó nên được tiền tố bằng “./”. Phương thức URL.String giờ chèn tiền tố này khi cần.

os

Hàm mới Executable trả về tên đường dẫn của tệp thực thi đang chạy.

Một nỗ lực gọi một phương thức trên os.File đã được đóng trước đây giờ sẽ trả về giá trị lỗi mới os.ErrClosed. Trước đây nó trả về một lỗi dành riêng cho hệ thống như syscall.EBADF.

Trên các hệ thống Unix, os.Rename giờ sẽ trả về lỗi khi được sử dụng để đổi tên thư mục thành một thư mục rỗng hiện có. Trước đây nó sẽ thất bại khi đổi tên thành thư mục không rỗng nhưng thành công khi đổi tên thành thư mục rỗng. Điều này làm cho hành vi trên Unix tương ứng với các hệ thống khác.

Trên Windows, các đường dẫn tuyệt đối dài giờ được chuyển đổi trong suốt thành các đường dẫn có độ dài mở rộng (các đường dẫn bắt đầu bằng “\\?\”). Điều này cho phép package làm việc với các tệp có tên đường dẫn dài hơn 260 ký tự.

Trên Windows, os.IsExist giờ sẽ trả về true cho lỗi hệ thống ERROR_DIR_NOT_EMPTY. Điều này tương ứng với việc xử lý hiện có của lỗi Unix ENOTEMPTY.

Trên Plan 9, các tệp không được phục vụ bởi #M giờ sẽ có ModeDevice được đặt trong giá trị được trả về bởi FileInfo.Mode.

path/filepath

Một số lỗi và trường hợp góc cạnh trên Windows đã được sửa: Abs giờ gọi Clean như đã ghi lại, Glob giờ khớp với “\\?\c:\*”, EvalSymlinks giờ xử lý đúng “C:.”, và Clean giờ xử lý đúng “..” đứng đầu trong đường dẫn.

reflect

Hàm mới Swapper đã được thêm vào để hỗ trợ sort.Slice.

strconv

Hàm Unquote giờ loại bỏ carriage return (\r) trong các chuỗi raw được trích dẫn backquote, theo ngữ nghĩa ngôn ngữ Go.

syscall

Getpagesize giờ trả về kích thước của hệ thống, thay vì giá trị hằng số. Trước đây nó luôn trả về 4KB.

Chữ ký của Utimes đã thay đổi trên Solaris để khớp với tất cả các chữ ký của các hệ thống Unix khác. Mã di động nên tiếp tục sử dụng os.Chtimes thay thế.

Trường X__cmsg_data đã bị xóa khỏi Cmsghdr.

text/template

Template.Execute giờ có thể nhận một reflect.Value làm đối số dữ liệu của nó, và các hàm FuncMap cũng có thể chấp nhận và trả về reflect.Value.

time

Hàm mới Until bổ sung cho hàm Since tương tự.

ParseDuration giờ chấp nhận các phần thập phân dài.

Parse giờ từ chối các ngày trước đầu của tháng, như ngày 0 tháng 6; nó đã từ chối các ngày ngoài cuối tháng, như ngày 31 tháng 6 và ngày 32 tháng 7.

Cơ sở dữ liệu tzdata đã được cập nhật lên phiên bản 2016j cho các hệ thống không có cơ sở dữ liệu múi giờ cục bộ.

testing

Phương thức mới T.Name (và B.Name) trả về tên của test hoặc benchmark hiện tại.

Hàm mới CoverMode báo cáo chế độ kiểm tra độ bao phủ.

Các test và benchmark giờ được đánh dấu là thất bại nếu bộ phát hiện race được bật và một data race xảy ra trong quá trình thực thi. Trước đây, các trường hợp test riêng lẻ có vẻ như đã vượt qua, và chỉ việc thực thi tổng thể của tệp nhị phân test mới thất bại.

Chữ ký của hàm MainStart đã thay đổi, như được cho phép bởi tài liệu. Đây là chi tiết nội bộ và không phải là một phần của cam kết tương thích Go 1. Nếu bạn không gọi MainStart trực tiếp nhưng thấy các lỗi, điều đó có thể có nghĩa là bạn đặt biến môi trường GOROOT thường rỗng và nó không khớp với phiên bản của nhị phân lệnh go của bạn.

unicode

SimpleFold giờ trả về đối số của nó không thay đổi nếu đầu vào được cung cấp là một rune không hợp lệ. Trước đây, việc triển khai thất bại với panic kiểm tra giới hạn chỉ mục.