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 15658 và issue 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_ENABLED vì make.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/template và
unicode/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à
SliceStable và
SliceIsSorted.
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 Flusher và Hijacker 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ó:
Server.Shutdownmới nhận đối số context.- Đã có các bổ sung đáng kể cho package database/sql với hỗ trợ context.
- Tất cả chín phương thức
Lookupmới trênnet.Resolvermới đều nhận context.
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
MutexProfile và
SetMutexProfileFraction 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 Timeout và
Temporary.
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),
SupportedProtos và SupportedVersions.
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.QueryContext và
DB.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.Ping
và
DB.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.StringTable và
Section.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
Read
và
Write
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.Value và
Func.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,
Fscanf và
Sscanf 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.
-
Serverthêm các tùy chọn cấu hìnhReadHeaderTimeoutvàIdleTimeoutvà ghi lạiWriteTimeout. -
FileServervàServeContentgiờ hỗ trợ các yêu cầu điều kiện HTTPIf-Match, ngoài hỗ trợIf-None-Matchtrướ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ởiRequest.Contextbị hủy nếunet.Connbê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,Handlergiờ có thể phát hiện rằng người dùng đã đi. Điều này bổ sung cho hỗ trợCloseNotifierhiện có. Chức năng này yêu cầu rằngnet.Connbê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ế
TrailerPrefixmới. -
Handlergiờ có thể hủy bỏ một phản hồi bằng cách panic với lỗiErrAbortHandler. -
Writebằng không byte đến mộtResponseWritergiờ được định nghĩa là một cách để kiểm tra xemResponseWritercó bị hijack hay không: nếu có,Writetrả vềErrHijackedmà không in lỗi vào log lỗi của server.
Thay đổi Client & Transport:
-
Clientgiờ 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ểuClientđể biết chi tiết. -
Transportgiờ hỗ trợ tên miền quốc tế. Do đó, Get và các helper khác cũng vậy. -
Clientgiờ hỗ trợ chuyển hướng 301, 307 và 308. Ví dụ,Client.Postgiờ theo dõi các chuyển hướng 301, chuyển đổi chúng thành các yêu cầuGETkhô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.Clientgiờ 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ườngRequest.GetBodymới được định nghĩa.NewRequestđặtRequest.GetBodytự động cho các kiểu thân phổ biến. -
Transportgiờ 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ố. -
Transportgiờ 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.ProxyConnectHeadermới cho phép cấu hình các giá trị header để gửi đến proxy trong một yêu cầuCONNECT. -
DefaultTransport.Dialergiờ 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. -
Transportkhông còn đọc một byte củaRequest.Bodykhông nil khiRequest.ContentLengthbằng không để xác định xemContentLengththự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ànhnil, hoặc đặt nó thành giá trị mớiNoBody. Giá trịNoBodymới được dùng bởi các hàm constructorRequest; nó được sử dụng bởiNewRequest.
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.TLSHandshakeStart và
ClientTrace.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
"" <gopher@example.com>,
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
PathEscape
và
PathUnescape
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.Hostname
và
URL.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.BinaryMarshaler và
encoding.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.