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.CallersFramesruntime.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ượ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ỏ.

godocgo 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 UnreadRuneUnreadByte 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.Type mô 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, uint32uint64.

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à FuncFuncOf. Đâ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.)