Ghi chú phát hành Go 1.12
Giới thiệu về Go 1.12
Bản phát hành Go mới nhất, phiên bản 1.12, ra đời sáu tháng sau Go 1.11. Phần lớn các thay đổi nằm ở phần triển khai toolchain, runtime và thư viện. Như thường lệ, bản phát hành này 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 đây.
Thay đổi về ngôn ngữ
Không có thay đổi nào trong đặc tả ngôn ngữ.
Nền tảng
Trình phát hiện race (race detector) hiện đã được hỗ trợ trên linux/arm64.
Go 1.12 là bản phát hành cuối cùng được hỗ trợ trên FreeBSD 10.x, vốn đã hết vòng đời (end-of-life). Go 1.13 sẽ yêu cầu FreeBSD 11.2+ hoặc FreeBSD 12.0+. FreeBSD 12.0+ yêu cầu kernel có tùy chọn COMPAT_FREEBSD11 được bật (đây là mặc định).
cgo hiện đã được hỗ trợ trên linux/ppc64.
hurd hiện là một giá trị được nhận diện cho GOOS, dành riêng
cho hệ thống GNU/Hurd khi sử dụng với gccgo.
Windows
Cổng windows/arm mới của Go hỗ trợ chạy Go trên Windows 10
IoT Core trên các chip ARM 32-bit như Raspberry Pi 3.
AIX
Go hiện hỗ trợ AIX 7.2 trở lên trên kiến trúc POWER8 (aix/ppc64). Liên kết ngoài (external linking), cgo, pprof và trình phát hiện race chưa được hỗ trợ.
Darwin
Go 1.12 là bản phát hành cuối cùng chạy được trên macOS 10.10 Yosemite. Go 1.13 sẽ yêu cầu macOS 10.11 El Capitan trở lên.
libSystem hiện được sử dụng khi thực hiện syscall trên Darwin,
đảm bảo khả năng tương thích tiến với các phiên bản macOS và iOS trong tương lai.
Việc chuyển sang libSystem đã kích hoạt thêm các kiểm tra App Store
đối với việc sử dụng API riêng tư. Vì được coi là riêng tư,
syscall.Getdirentries hiện luôn thất bại với
ENOSYS trên iOS.
Ngoài ra, syscall.Setrlimit
trả về invalid argument ở những nơi mà trước đây thành công.
Những hậu quả này không đặc thù riêng của Go và người dùng nên kỳ vọng
hành vi tương đương với triển khai của libSystem trong tương lai.
Công cụ
go tool vet không còn được hỗ trợ
Lệnh go vet đã được viết lại để làm nền tảng cho nhiều
công cụ phân tích mã nguồn khác nhau. Xem
gói golang.org/x/tools/go/analysis
để biết thêm chi tiết. Một tác dụng phụ là go tool vet
không còn được hỗ trợ nữa. Các công cụ bên ngoài sử dụng go tool vet phải được cập nhật để dùng go vet. Việc dùng go vet thay cho go tool vet sẽ hoạt động với tất cả các phiên bản Go được hỗ trợ.
Trong khuôn khổ thay đổi này, tùy chọn thử nghiệm -shadow
không còn khả dụng với go vet. Việc kiểm tra
biến shadowing có thể thực hiện qua:
go get -u golang.org/x/tools/go/analysis/passes/shadow/cmd/shadow
go vet -vettool=$(which shadow)
Tour
Go tour không còn được bao gồm trong gói phân phối nhị phân chính. Để
chạy tour cục bộ, thay vì dùng go tool tour,
hãy cài đặt thủ công:
go get -u golang.org/x/tour
tour
Yêu cầu build cache
Build cache hiện là
bắt buộc như một bước hướng tới việc loại bỏ
$GOPATH/pkg. Đặt biến môi trường
GOCACHE=off sẽ khiến các lệnh go ghi vào
cache bị lỗi.
Gói chỉ nhị phân (binary-only packages)
Go 1.12 là bản phát hành cuối cùng hỗ trợ các gói chỉ nhị phân.
Cgo
Go 1.12 sẽ dịch kiểu C EGLDisplay sang kiểu Go uintptr.
Thay đổi này tương tự cách Go 1.10 và mới hơn xử lý các kiểu
CoreFoundation của Darwin và JNI của Java. Xem
tài liệu cgo
để biết thêm thông tin.
Các tên C bị xáo trộn (mangled C names) không còn được chấp nhận trong các gói sử dụng Cgo. Hãy dùng
tên Cgo thay thế. Ví dụ: dùng tên cgo được ghi chép là C.char
thay vì tên bị xáo trộn _Ctype_char do cgo sinh ra.
Module
Khi GO111MODULE được đặt thành on, lệnh go
hiện hỗ trợ các thao tác nhận biết module bên ngoài thư mục module,
miễn là các thao tác đó không cần phân giải đường dẫn import tương đối so với
thư mục hiện tại hoặc chỉnh sửa trực tiếp tệp go.mod.
Các lệnh như go get,
go list, và
go mod download hoạt động như thể trong một
module với yêu cầu ban đầu trống.
Trong chế độ này, go env GOMOD trả về
thiết bị null của hệ thống (/dev/null hoặc NUL).
Các lệnh go tải xuống và giải nén module hiện an toàn để
gọi đồng thời.
Cache module (GOPATH/pkg/mod) phải nằm trên filesystem hỗ trợ
file locking.
Chỉ thị go trong tệp go.mod hiện cho biết
phiên bản ngôn ngữ được sử dụng bởi các tệp trong module đó.
Nó sẽ được đặt thành bản phát hành hiện tại
(go 1.12) nếu chưa có phiên bản nào.
Nếu chỉ thị go của một module chỉ định một phiên bản mới hơn
toolchain đang dùng, lệnh go sẽ thử build các gói bất kể,
và chỉ ghi nhận sự không khớp nếu quá trình build thất bại.
Sự thay đổi này trong cách dùng chỉ thị go có nghĩa là nếu
bạn dùng Go 1.12 để build một module, qua đó ghi go 1.12
vào tệp go.mod, bạn sẽ gặp lỗi khi
cố gắng build module đó với Go 1.11 đến Go 1.11.3.
Go 1.11.4 trở lên sẽ hoạt động bình thường, cũng như các bản phát hành cũ hơn Go 1.11.
Nếu bạn phải dùng Go 1.11 đến 1.11.3, bạn có thể tránh vấn đề bằng cách
đặt phiên bản ngôn ngữ thành 1.11, dùng công cụ go của Go 1.12,
qua go mod edit -go=1.11.
Khi không thể phân giải một import bằng các module đang hoạt động,
lệnh go sẽ thử dùng các module được đề cập trong các chỉ thị replace
của module chính trước khi tham khảo cache module
và các nguồn mạng thông thường.
Nếu tìm thấy một bản thay thế phù hợp nhưng chỉ thị replace
không chỉ định phiên bản, lệnh go sẽ dùng một pseudo-version
dẫn xuất từ time.Time bằng không (ví dụ
như v0.0.0-00010101000000-000000000000).
Toolchain trình biên dịch
Phân tích biến sống (live variable analysis) của trình biên dịch đã được cải thiện. Điều này có thể có nghĩa là
các finalizer sẽ được thực thi sớm hơn trong bản phát hành này so với các bản trước.
Nếu điều đó gây ra vấn đề, hãy xem xét việc thêm lệnh gọi
runtime.KeepAlive phù hợp.
Nhiều hàm hơn hiện đủ điều kiện được inline theo mặc định, bao gồm
các hàm chỉ đơn giản gọi một hàm khác.
Việc inline thêm này làm cho việc dùng
runtime.CallersFrames
thay vì lặp trực tiếp qua kết quả của
runtime.Callers trở nên quan trọng hơn.
// Old code which no longer works correctly (it will miss inlined call frames).
var pcs [10]uintptr
n := runtime.Callers(1, pcs[:])
for _, pc := range pcs[:n] {
f := runtime.FuncForPC(pc)
if f != nil {
fmt.Println(f.Name())
}
}
// New code which will work correctly.
var pcs [10]uintptr
n := runtime.Callers(1, pcs[:])
frames := runtime.CallersFrames(pcs[:n])
for {
frame, more := frames.Next()
fmt.Println(frame.Function)
if !more {
break
}
}
Các wrapper do trình biên dịch tạo ra để triển khai method expression
không còn được báo cáo bởi runtime.CallersFrames
và runtime.Stack. Chúng
cũng không được in trong stack trace khi panic.
Thay đổi này giúp toolchain gc phù hợp với
toolchain gccgo, vốn đã bỏ qua các wrapper như vậy
khỏi stack trace.
Các client của các API này có thể cần điều chỉnh để thích nghi với các frame bị thiếu.
Đối với code cần hoạt động liên thông giữa các bản phát hành 1.11 và 1.12,
bạn có thể thay thế method expression x.M
bằng hàm literal func (...) { x.M(...) } .
Trình biên dịch hiện chấp nhận cờ -lang để đặt phiên bản ngôn ngữ Go
cần sử dụng. Ví dụ: -lang=go1.8 khiến trình biên dịch
phát ra lỗi nếu chương trình dùng type alias, được thêm vào trong Go 1.9.
Các thay đổi ngôn ngữ thực hiện trước Go 1.12 không được kiểm tra nhất quán.
Toolchain trình biên dịch hiện sử dụng các quy ước khác nhau để gọi các hàm Go và hàm assembly. Điều này sẽ vô hình với người dùng, ngoại trừ các lệnh gọi đồng thời vượt qua biên giới Go-assembly và vượt qua ranh giới gói. Nếu quá trình liên kết dẫn đến lỗi như “relocation target not defined for ABIInternal (but is defined for ABI0)”, hãy tham khảo phần tương thích của tài liệu thiết kế ABI.
Đã có nhiều cải tiến về thông tin gỡ lỗi DWARF do trình biên dịch tạo ra, bao gồm cải tiến về in tham số và thông tin vị trí biến.
Các chương trình Go hiện cũng duy trì stack frame pointer trên linux/arm64
để hỗ trợ các công cụ profiling như perf. Việc duy trì frame pointer
có chi phí runtime nhỏ, biến động nhưng trung bình khoảng 3%.
Để build toolchain không dùng frame pointer, đặt
GOEXPERIMENT=noframepointer khi chạy make.bash.
Chế độ trình biên dịch “safe” đã lỗi thời (bật bằng gcflag -u) đã bị loại bỏ.
godoc và go doc
Trong Go 1.12, godoc không còn có giao diện dòng lệnh và
chỉ là web server. Người dùng nên dùng go doc
để xuất trợ giúp dòng lệnh thay thế. Go 1.12 là bản phát hành cuối cùng bao gồm
web server godoc; trong Go 1.13 nó sẽ có sẵn
qua go get.
go doc hiện hỗ trợ cờ -all,
khiến nó in ra tất cả các API được xuất khẩu và tài liệu của chúng,
như lệnh godoc trước đây từng làm.
go doc cũng có thêm cờ -src,
sẽ hiển thị mã nguồn của đích.
Trace
Công cụ trace hiện hỗ trợ vẽ đồ thị mutator utilization curves, bao gồm tham chiếu chéo đến execution trace. Chúng hữu ích để phân tích tác động của bộ gom rác đến độ trễ và thông lượng của ứng dụng.
Assembler
Trên arm64, thanh ghi nền tảng được đổi tên từ
R18 thành R18_PLATFORM để ngăn chặn việc sử dụng nhầm,
vì hệ điều hành có thể chọn dành riêng thanh ghi này.
Runtime
Go 1.12 cải thiện đáng kể hiệu suất của quá trình sweeping khi một phần lớn heap vẫn còn sống. Điều này giảm độ trễ phân bổ ngay sau một lần garbage collection.
Go runtime hiện trả lại bộ nhớ cho hệ điều hành tích cực hơn, đặc biệt để phản hồi các phân bổ lớn không thể tái sử dụng không gian heap hiện có.
Mã timer và deadline của Go runtime nhanh hơn và mở rộng tốt hơn với số lượng CPU cao hơn. Điều này cải thiện hiệu suất của việc thao tác deadline kết nối mạng.
Trên Linux, runtime hiện dùng MADV_FREE để giải phóng
bộ nhớ chưa sử dụng. Điều này hiệu quả hơn nhưng có thể dẫn đến RSS
được báo cáo cao hơn. Kernel sẽ thu hồi dữ liệu chưa sử dụng khi cần.
Để quay lại hành vi của Go 1.11 (MADV_DONTNEED), đặt
biến môi trường GODEBUG=madvdontneed=1.
Thêm cpu.extension=off vào biến môi trường GODEBUG hiện vô hiệu hóa việc sử dụng các phần mở rộng tập lệnh CPU tùy chọn trong thư viện chuẩn và runtime. Điều này chưa được hỗ trợ trên Windows.
Go 1.12 cải thiện độ chính xác của memory profile bằng cách sửa lỗi đếm quá mức (overcounting) của các phân bổ heap lớn.
Traceback, runtime.Caller,
và runtime.Callers không còn bao gồm
các hàm khởi tạo do trình biên dịch sinh ra. Thực hiện traceback
trong quá trình khởi tạo một biến toàn cục sẽ hiển thị
một hàm có tên PKG.init.ializers.
Thư viện chuẩn
TLS 1.3
Go 1.12 bổ sung hỗ trợ opt-in cho TLS 1.3 trong gói crypto/tls theo
đặc tả của RFC 8446. Tính năng này có thể
được bật bằng cách thêm giá trị tls13=1 vào biến môi trường GODEBUG.
Nó sẽ được bật mặc định trong Go 1.13.
Để đàm phán TLS 1.3, hãy đảm bảo bạn không đặt MaxVersion rõ ràng trong
Config và chạy chương trình với
biến môi trường GODEBUG=tls13=1 được đặt.
Tất cả các tính năng TLS 1.2 ngoại trừ TLSUnique trong
ConnectionState
và renegotiation đều có sẵn trong TLS 1.3 và cung cấp bảo mật cùng
hiệu suất tương đương hoặc tốt hơn. Lưu ý rằng dù TLS 1.3 tương thích ngược
với các phiên bản trước, một số hệ thống kế thừa nhất định có thể không hoạt động
đúng khi cố gắng đàm phán nó. Các khóa chứng chỉ RSA quá nhỏ
để an toàn (bao gồm khóa 512-bit) sẽ không hoạt động với TLS 1.3.
Các cipher suite của TLS 1.3 không thể cấu hình. Tất cả các cipher suite được hỗ trợ đều
an toàn, và nếu PreferServerCipherSuites được đặt trong
Config, thứ tự ưu tiên
dựa trên phần cứng khả dụng.
Early data (còn gọi là “0-RTT mode”) hiện không được hỗ trợ như là client hoặc server. Ngoài ra, server Go 1.12 không hỗ trợ bỏ qua early data bất ngờ nếu client gửi nó. Vì chế độ TLS 1.3 0-RTT liên quan đến client giữ trạng thái về server nào hỗ trợ 0-RTT, server Go 1.12 không thể là một phần của nhóm cân bằng tải (load-balancing pool) nơi một số server khác hỗ trợ 0-RTT. Nếu chuyển một domain từ server hỗ trợ 0-RTT sang server Go 1.12, 0-RTT phải được tắt trong ít nhất thời gian tồn tại của session ticket đã cấp trước khi chuyển đổi để đảm bảo hoạt động không bị gián đoạn.
Trong TLS 1.3, client là người nói cuối cùng trong quá trình handshake, vì vậy nếu nó gây ra
lỗi trên server, lỗi đó sẽ được trả về cho client qua lần gọi
Read đầu tiên, không phải qua
Handshake. Ví dụ:
đây sẽ là trường hợp nếu server từ chối chứng chỉ client.
Tương tự, session ticket hiện là tin nhắn post-handshake, vì vậy chỉ
được client nhận tại lần gọi
Read đầu tiên của nó.
Các thay đổi nhỏ trong thư viện
Như thường lệ, có nhiều thay đổi và cập nhật nhỏ đối với 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í.
bufio
Các phương thức UnreadRune và
UnreadByte của Reader hiện sẽ trả về lỗi
nếu chúng được gọi sau Peek.
bytes
Hàm mới ReplaceAll trả về bản sao của
một byte slice với tất cả các thể hiện không chồng lấp của một giá trị được thay thế bằng giá trị khác.
Con trỏ đến Reader với giá trị bằng không hiện
tương đương về chức năng với NewReader(nil).
Trước Go 1.12, cái trước không thể dùng thay thế cho cái sau trong mọi trường hợp.
crypto/rand
Một cảnh báo sẽ được in ra standard error lần đầu tiên
Reader.Read bị chặn hơn 60 giây khi chờ
đọc entropy từ kernel.
Trên FreeBSD, Reader hiện dùng lệnh gọi hệ thống getrandom
nếu có, ngược lại dùng /dev/urandom.
crypto/rc4
Bản phát hành này loại bỏ các triển khai assembly, chỉ giữ lại phiên bản Go thuần túy. Trình biên dịch Go tạo ra code tốt hơn hoặc tệ hơn một chút, tùy thuộc vào CPU cụ thể. RC4 không an toàn và chỉ nên dùng để tương thích với các hệ thống kế thừa.
crypto/tls
Nếu client gửi tin nhắn ban đầu không trông giống TLS, server
sẽ không còn trả lời với một cảnh báo, và nó sẽ để lộ
net.Conn bên dưới trong trường mới Conn của
RecordHeaderError.
database/sql
Con trỏ truy vấn (query cursor) hiện có thể thu được bằng cách truyền một giá trị
*Rows
vào phương thức Row.Scan.
expvar
Phương thức mới Delete cho phép
xóa các cặp key/value khỏi Map.
fmt
Map hiện được in theo thứ tự sắp xếp key để dễ kiểm thử. Các quy tắc sắp xếp là:
- Khi áp dụng, nil so sánh thấp hơn
- int, float và string sắp xếp theo <
- NaN so sánh nhỏ hơn float không phải NaN
- bool so sánh false trước true
- Complex so sánh phần thực, sau đó phần ảo
- Con trỏ so sánh theo địa chỉ máy
- Giá trị channel so sánh theo địa chỉ máy
- Struct so sánh từng trường lần lượt
- Array so sánh từng phần tử lần lượt
- Giá trị interface so sánh trước tiên theo
reflect.Typemô tả kiểu cụ thể và sau đó theo giá trị cụ thể như được mô tả trong các quy tắc trước.
Khi in map, các giá trị key không phản xạ (non-reflexive) như NaN trước đây
được hiển thị là <nil>. Từ bản phát hành này, các giá trị đúng được in.
go/doc
Để giải quyết một số vấn đề tồn đọng trong cmd/doc,
gói này có bit Mode mới,
PreserveAST, kiểm soát liệu dữ liệu AST có bị xóa không.
go/token
Kiểu File có trường mới
LineStart,
trả về vị trí bắt đầu của một dòng cho trước. Điều này đặc biệt hữu ích
trong các chương trình đôi khi xử lý các tệp không phải Go, như assembly, nhưng muốn dùng
cơ chế token.Pos để xác định vị trí tệp.
image
Hàm RegisterFormat hiện an toàn để sử dụng đồng thời.
image/png
Ảnh Paletted với ít hơn 16 màu hiện mã hóa thành output nhỏ hơn.
io
Interface mới StringWriter bao bọc
hàm WriteString.
math
Các hàm
Sin,
Cos,
Tan,
và Sincos hiện
áp dụng Payne-Hanek range reduction cho các đối số rất lớn. Điều này
tạo ra kết quả chính xác hơn, nhưng chúng sẽ không giống bit-cho-bit
với các kết quả trong các bản phát hành trước.
math/bits
Các phép toán độ chính xác mở rộng mới Add, Sub, Mul, và Div có sẵn trong các phiên bản uint, uint32 và uint64.
net
Cài đặt
Dialer.DualStack hiện bị bỏ qua và không còn được dùng (deprecated);
RFC 6555 Fast Fallback (“Happy Eyeballs”) hiện được bật mặc định. Để tắt, đặt
Dialer.FallbackDelay thành một giá trị âm.
Tương tự, TCP keep-alive hiện được bật mặc định nếu
Dialer.KeepAlive bằng không.
Để tắt, đặt nó thành một giá trị âm.
Trên Linux, system call splice hiện được sử dụng khi sao chép từ
UnixConn sang
TCPConn.
net/http
HTTP server hiện từ chối các yêu cầu HTTP bị định hướng sai (misdirected) đến server HTTPS với phản hồi plaintext “400 Bad Request”.
Phương thức mới Client.CloseIdleConnections
gọi CloseIdleConnections của Transport bên dưới của Client
nếu nó có.
Transport không còn từ chối các phản hồi HTTP khai báo
HTTP Trailer nhưng không dùng chunked encoding. Thay vào đó, các trailer được khai báo hiện chỉ đơn giản bị bỏ qua.
Transport không còn xử lý các giá trị MAX_CONCURRENT_STREAMS
được quảng bá từ server HTTP/2 một cách nghiêm ngặt như trong Go 1.10 và Go 1.11. Hành vi mặc định hiện trở lại
như trong Go 1.9: mỗi kết nối đến một server có thể có tối đa MAX_CONCURRENT_STREAMS yêu cầu
đang hoạt động và sau đó các kết nối TCP mới được tạo khi cần. Trong Go 1.10 và Go 1.11, gói http2
sẽ chặn và chờ các yêu cầu hoàn thành thay vì tạo kết nối mới.
Để lấy lại hành vi nghiêm ngặt hơn, hãy import trực tiếp gói
golang.org/x/net/http2
và đặt
Transport.StrictMaxConcurrentStreams thành
true.
net/url
Parse,
ParseRequestURI,
và
URL.Parse
hiện trả về lỗi cho các URL chứa ký tự điều khiển ASCII, bao gồm NULL,
tab và xuống dòng.
net/http/httputil
ReverseProxy hiện tự động
proxy các yêu cầu WebSocket.
os
Phương thức mới ProcessState.ExitCode
trả về mã thoát của tiến trình.
ModeCharDevice đã được thêm vào bitmask ModeType, cho phép
ModeDevice | ModeCharDevice được khôi phục khi che (masking) một
FileMode với ModeType.
Hàm mới UserHomeDir trả về
thư mục home của người dùng hiện tại.
RemoveAll hiện hỗ trợ các đường dẫn dài hơn 4096 ký tự
trên hầu hết các hệ thống Unix.
File.Sync hiện sử dụng F_FULLFSYNC trên macOS
để xả đúng nội dung tệp vào bộ nhớ vĩnh cửu.
Điều này có thể khiến phương thức chạy chậm hơn so với các bản phát hành trước.
File hiện hỗ trợ
phương thức SyscallConn
trả về giá trị interface
syscall.RawConn.
Điều này có thể được dùng để gọi các thao tác đặc thù hệ thống
trên file descriptor bên dưới.
path/filepath
Hàm IsAbs hiện trả về true khi được truyền
một tên tệp dành riêng trên Windows như NUL.
Danh sách các tên dành riêng.
reflect
Kiểu MapIter mới là
một iterator để duyệt qua một map. Kiểu này được truy cập qua
phương thức mới MapRange của kiểu
Value.
Nó tuân theo cùng ngữ nghĩa lặp như một câu lệnh range, với Next
để tiến iterator, và Key/Value để truy cập từng mục.
regexp
Copy không còn cần thiết
để tránh tranh chấp khóa (lock contention), vì vậy nó đã được đánh dấu không còn được khuyến nghị một phần.
Copy
vẫn có thể phù hợp nếu lý do sử dụng là để tạo hai bản sao với
cài đặt Longest khác nhau.
runtime/debug
Kiểu BuildInfo mới
để lộ thông tin build đọc từ binary đang chạy, chỉ có sẵn trong
các binary được build với hỗ trợ module. Điều này bao gồm đường dẫn gói chính,
thông tin module chính và các phụ thuộc module. Kiểu này được cung cấp qua
hàm ReadBuildInfo
trên BuildInfo.
strings
Hàm mới ReplaceAll trả về bản sao của
một chuỗi với tất cả các thể hiện không chồng lấp của một giá trị được thay thế bằng giá trị khác.
Con trỏ đến Reader với giá trị bằng không hiện
tương đương về chức năng với NewReader(nil).
Trước Go 1.12, cái trước không thể dùng thay thế cho cái sau trong mọi trường hợp.
Phương thức mới Builder.Cap trả về dung lượng của byte slice bên dưới builder.
Các hàm ánh xạ ký tự Map,
Title,
ToLower,
ToLowerSpecial,
ToTitle,
ToTitleSpecial,
ToUpper, và
ToUpperSpecial
hiện luôn đảm bảo trả về UTF-8 hợp lệ. Trong các bản phát hành trước, nếu đầu vào là UTF-8 không hợp lệ nhưng không cần thay thế ký tự nào,
các hàm này trả về UTF-8 không hợp lệ đó mà không thay đổi.
syscall
Inode 64-bit hiện được hỗ trợ trên FreeBSD 12. Một số kiểu đã được điều chỉnh theo.
Họ địa chỉ Unix socket
(AF_UNIX)
hiện được hỗ trợ cho các phiên bản Windows tương thích.
Hàm mới Syscall18
đã được giới thiệu cho Windows, cho phép gọi với tối đa 18 đối số.
syscall/js
Kiểu Callback và hàm NewCallback đã được đổi tên;
chúng hiện được gọi là
Func và
FuncOf.
Đây là một thay đổi phá vỡ, nhưng hỗ trợ WebAssembly vẫn là thử nghiệm
và chưa tuân theo
cam kết tương thích Go 1. Bất kỳ code nào dùng
tên cũ cần được cập nhật.
Nếu một kiểu triển khai interface mới
Wrapper,
ValueOf
sẽ dùng nó để trả về giá trị JavaScript cho kiểu đó.
Ý nghĩa của
Value bằng không
đã thay đổi. Nó hiện đại diện cho giá trị JavaScript undefined
thay vì số không.
Đây là một thay đổi phá vỡ, nhưng hỗ trợ WebAssembly vẫn là thử nghiệm
và chưa tuân theo
cam kết tương thích Go 1. Bất kỳ code nào phụ thuộc vào
Value bằng không
để có nghĩa là số không cần được cập nhật.
Phương thức mới
Value.Truthy
báo cáo
“tính truthy” JavaScript
của một giá trị cho trước.
testing
Cờ -benchtime hiện hỗ trợ đặt số lần lặp rõ ràng thay vì thời gian khi giá trị kết thúc bằng “x”. Ví dụ: -benchtime=100x chạy benchmark 100 lần.
text/template
Khi thực thi template, các giá trị context dài không còn bị cắt ngắn trong thông báo lỗi.
executing "tmpl" at <.very.deep.context.v...>: map has no entry for key "notpresent"
hiện là
executing "tmpl" at <.very.deep.context.value.notpresent>: map has no entry for key "notpresent"
Nếu một hàm do người dùng định nghĩa được gọi bởi template bị panic, panic đó
hiện được bắt và trả về dưới dạng lỗi bởi
phương thức Execute hoặc ExecuteTemplate.
time
Cơ sở dữ liệu múi giờ trong $GOROOT/lib/time/zoneinfo.zip
đã được cập nhật lên phiên bản 2018i. Lưu ý rằng tệp ZIP này chỉ
được dùng nếu hệ điều hành không cung cấp cơ sở dữ liệu múi giờ.
unsafe
Việc chuyển đổi một unsafe.Pointer nil sang uintptr và ngược lại với số học là không hợp lệ.
(Điều này đã không hợp lệ trước đó, nhưng hiện sẽ khiến trình biên dịch hoạt động sai.)