Ghi chú phát hành Go 1.10 với các điểm nổi bật - game bài đổi thưởng 2023

| May 14, 2025 min read

Ngày 15 tháng 9 năm 2019 - Máy tính

Phiên bản Go [u88 ibet1668 casino](/post/go1dot10-release-notes/) 1.10 đã được ra mắt đúng hẹn sau nửa năm kể từ phiên bản Go 1.9. Các thay đổi chính tập trung vào chuỗi công cụ, thời gian chạy và thư viện. Như thường lệ, phiên bản này tuân thủ nguyên tắc tương thích của Go 1, đảm bảo tất cả các chương trình Go đều có thể biên dịch và chạy như trước đây.

Trong phiên bản này, bộ đệm xây dựng gói đã được cải thiện, thêm khả năng lưu kết quả thử nghiệm thành công, tự động kiểm tra khi thử nghiệm và cho phép truyền giá trị kiểu string trực tiếp giữa mã Go và C thông qua cgo.

1. Ngôn ngữ Không có sự thay đổi lớn về mặt cú pháp. Tuy nhiên, các phép dịch chuyển không rõ kiểu đã được làm rõ hơn, hiện nay trình biên dịch cho phép các biểu thức chỉ mục như x[1.0 « s] (với s là biến kiểu số nguyên không dấu).

Cú pháp method expression đã được nới lỏng để cho phép bất kỳ biểu thức kiểu nào làm receiver; ví dụ như struct{io.Reader}.Read là hợp lệ.

2. Công cụ

  • GOROOT và GOTMPDIR: Nếu không thiết lập $GOROOT, trước đây go tool sẽ sử dụng GOROOT mặc định lúc biên dịch chuỗi công cụ. Giờ đây, go tool sẽ suy luận GOROOT từ đường dẫn thực thi của nó trước khi sử dụng cài đặt mặc định. Điều này cho phép tệp nhị phân được giải nén ở bất kỳ vị trí nào trong hệ thống tệp mà không cần thiết lập rõ ràng GOROOT.

Mặc định, go tool sẽ tạo thư mục và tệp trong thư mục tạm thời của hệ thống (như $TMPDIR trên Unix), trừ khi biến mới $GOTMPDIR được thiết lập, trong trường hợp đó nó sẽ tạo trong thư mục đó.

  • Xây dựng và Cài đặt: Lệnh go build bây giờ có thể phát hiện các gói hết hạn dựa trên nội dung nguồn và các thẻ xây dựng cũng như siêu dữ liệu được lưu trữ trong các gói đã biên dịch. Thời gian sửa đổi không còn được xem xét nữa. Khi thời gian sửa đổi gây hiểu lầm, khuyến nghị trước đây là thêm tùy chọn -a để buộc xây dựng đã không còn cần thiết: việc xây dựng hiện luôn kiểm tra khi nào gói cần được tái biên dịch.

Các tùy chọn -asmflags, -gcflags, -gccgoflags-ldflags của go build hiện chỉ áp dụng theo mặc định cho các gói được liệt kê trực tiếp trên dòng lệnh. Ví dụ, go build -gcflags=-m mypkg sẽ truyền tùy chọn -m đến trình biên dịch khi xây dựng gói mypkg chứ không phải các phụ thuộc của nó. Cách mới linh hoạt hơn là -asmflags=pattern=flags chỉ áp dụng các cờ cho các gói khớp với mẫu. Chi tiết hơn, xem go help build.

Lệnh go build hiện duy trì một bộ đệm các gói gần đây đã được xây dựng (khác với đường dẫn cài đặt gói $GOROOT/pkg hoặc $GOPATH/pkg). Bộ đệm này nên giúp tăng tốc độ xây dựng khi không cài đặt gói rõ ràng hoặc khi chuyển đổi giữa các bản sao khác nhau của mã nguồn (chẳng hạn khi chuyển đổi giữa các nhánh khác nhau của cùng một hệ thống kiểm soát phiên bản). Khuyến nghị trước đây là thêm cờ -i để tăng tốc (go build -i hoặc go test -i) giờ không còn cần thiết: có hay không có -i thì tốc độ vẫn như nhau. Chi tiết hơn, xem go help cache.

Lệnh go install hiện chỉ cài đặt các gói và lệnh được liệt kê trực tiếp trên dòng lệnh. Ví dụ, go install cmd/gofmt cài đặt chương trình gofmt nhưng không cài đặt bất kỳ phụ thuộc nào của nó. Bộ đệm xây dựng mới đảm bảo rằng các lệnh trong tương lai vẫn có thể chạy nhanh như khi các phụ thuộc đã được cài đặt. Sử dụng tùy chọn mới -i của go install có thể buộc cài đặt phụ thuộc.

Nhiều chi tiết triển khai của go build đã được hỗ trợ cho những cải tiến này. Một thay đổi mới là các gói nhị phân thuần túy phải khai báo chính xác khối liên kết trong mã nguồn của chúng. Điều này đảm bảo rằng các liên kết này sẵn sàng khi sử dụng gói nhị phân thuần túy để liên kết một chương trình. Chi tiết hơn, xem go help filetype.

  • Kiểm thử: Lệnh go test hiện lưu giữ kết quả kiểm thử: nếu chương trình kiểm thử có thể thực thi và dòng lệnh khớp với lần thực thi trước, và phát hiện rằng các tệp và biến môi trường không thay đổi, thì go test sẽ in kết quả kiểm thử trước đó (trường thời gian tiêu thụ sẽ được thay thế bằng chuỗi “(cached)”). Bộ nhớ đệm kiểm thử chỉ áp dụng cho kết quả kiểm thử thành công; chỉ áp dụng cho lệnh go test với các gói được liệt kê rõ ràng; chỉ áp dụng cho dòng lệnh chứa tập con các cờ kiểm thử -cpu, -list, -parallel, -run, -short-v. Cách lý tưởng để bỏ qua bộ nhớ đệm kiểm thử là sử dụng -count=1.

Lệnh go test hiện tự động chạy go vet cho gói sẽ kiểm thử, nhằm nhận diện các vấn đề quan trọng trước khi chạy kiểm thử. Những vấn đề này có thể gây lỗi xây dựng và ngăn chặn việc chạy kiểm thử. Sử dụng go test -vet=off để tắt kiểm tra này.

Tùy chọn -coverpkg của go test hiện giải thích tham số của nó là danh sách mẫu cách nhau bởi dấu hai chấm để khớp với mỗi phụ thuộc của kiểm thử, thay vì danh sách gói để tải lại. Ví dụ, go test -coverpkg=all hiện là một cách thú vị để bật kiểm thử bao phủ cho gói kiểm thử và tất cả phụ thuộc của nó. Tương tự, tùy chọn -coverprofile của go test hiện cũng hỗ trợ chạy nhiều nhóm kiểm thử.

Đối với các tình huống lỗi do thời gian chờ quá lâu, kiểm thử có khả năng cao hơn viết hình ảnh trước khi thoát.

Lệnh go test hiện hợp nhất đầu ra chuẩn và lỗi chuẩn từ thực thi nhị phân vào đầu ra chuẩn của chính go test, trong khi trước đây chỉ áp dụng hợp nhất phần lớn thời gian.

Hiện tại, khi kiểm thử song song bị tạm dừng hoặc tiếp tục, đầu ra của go test -v sẽ bao gồm các dòng trạng thái PAUSE và CONT.

Tùy chọn mới -failfast của go test sẽ không chạy các kiểm thử còn lại khi một kiểm thử thất bại. (Chú ý: các kiểm thử chạy song song sẽ hoàn thành ngay cả khi có lỗi.)

Cuối cùng, tùy chọn mới -json của go test lọc đầu ra kiểm thử thông qua lệnh mới go tool test2json để tạo mô tả thực thi kiểm thử ở dạng JSON dễ đọc cho máy. Điều này cho phép tạo thêm thông tin minh họa phong phú trong IDE và các công cụ khác.

Chi tiết hơn, xem go help test và tài liệu test2json.

  • Văn bản: Công cụ go doc hiện hiển thị kết quả hàm trả về slice của loại T hoặc _T (giống như cơ chế hiển thị hiện tại đối với hàm trả về đơn lẻ T hoặc _T).

Ví dụ:

$ go doc mail.Address
type Address struct {
	Name  string // Tên đầy đủ; có thể rỗng.
	Address string // user@domain
}
Address đại diện cho một địa chỉ email đơn lẻ. Địa chỉ kiểu "Barry Gibbs 
" được biểu diễn dưới dạng Address{Name: "Barry Gibbs", Address:
"bg@example.com"}.
func ParseAddress(address string) (*Address, error)
func ParseAddressList(list string) ([]*Address, error)
func (a *Address) String() string

Trước đây, hàm ParseAddressList chỉ xuất hiện trong bản xem trước gói (go doc mail).

  • Pprof: Các bức tranh khối lượng và khóa được tạo bởi gói runtime/pprof hiện bao gồm thông tin ký hiệu, có thể xem bằng go tool pprof mà không cần bản nhị phân tạo ra bức tranh. (Tất cả các loại bức tranh khác đã được cập nhật để bao gồm thông tin ký hiệu trong Go 1.9.)

Công cụ trực quan hóa bức tranh go tool pprof đã được cập nhật lên phiên bản git 9e20b5b (github.com/google/pprof), phiên bản này bao gồm giao diện web được cập nhật.

  • Vet: Lệnh go vet hiện luôn sử dụng thông tin kiểu mới nhất đầy đủ khi kiểm tra gói (ngay cả các gói sử dụng cgo hoặc vendored). Báo cáo kết quả nên chính xác hơn. Lưu ý rằng chỉ có go vet có quyền truy cập vào thông tin này, nên tránh sử dụng go tool vet. (Tính đến Go 1.9, go vet đã cung cấp truy cập vào tất cả các cờ giống như go tool vet.)

  • Gofmt: Định dạng mặc định của mã nguồn Go có hai thay đổi nhỏ. Thứ nhất, các biểu thức slice ba chỉ số trước đây được định dạng thành x[i+1 : j:k], nay được định dạng với khoảng trắng cố định thành x[i+1 : j : k]. Thứ hai, các giao diện phương thức đơn hàng viết trên một dòng (thỉnh thoảng được sử dụng trong khẳng định kiểu) sẽ không còn được định dạng thành nhiều dòng.

Lưu ý rằng các thay đổi nhỏ như vậy đối với gofmt sẽ tiếp tục xảy ra không định kỳ. Thông thường, hệ thống xây dựng kiểm tra mã nguồn nên khớp với đầu ra của phiên bản gofmt được chỉ định.

  • Chuỗi công cụ biên dịch: Chuỗi công cụ biên dịch đã có nhiều cải tiến về hiệu suất mã hóa (rộng rãi trên các kiến trúc được hỗ trợ).

Thông tin gỡ lỗi DWARF được ghi trong tệp nhị phân có một số cải tiến: các giá trị hằng số hiện được ghi lại; thông tin số dòng chính xác hơn, giúp gỡ lỗi cấp nguồn tốt hơn; và mỗi gói hiện trình bày đơn vị biên dịch DWARF riêng của nó.

Các chế độ xây dựng khác nhau đã được chuyển sang nhiều hệ thống hơn. Đặc biệt, c-shared hiện hoạt động trên linux/ppc64le, windows/386 và windows/amd64; pie hiện hoạt động trên darwin/amd64 và cũng được ép sử dụng liên kết bên ngoài trên tất cả các hệ thống; plugin hiện hoạt động trên linux/ppc64le và darwin/amd64.

Hệ thống linux/ppc64le hiện yêu cầu sử dụng liên kết bên ngoài cho bất kỳ chương trình nào sử dụng cgo (ngay cả khi được sử dụng bởi thư viện chuẩn).

3. Thời gian chạy Hành vi của các cuộc gọi lồng nhau LockOSThread và UnlockOSThread đã thay đổi. Các hàm này dùng để kiểm soát xem một goroutine có bị khóa vào một luồng hệ điều hành hay không, để goroutine chỉ chạy trên luồng đó và luồng đó chỉ chạy goroutine đó. Trước đây, nhiều cuộc gọi LockOSThread liên tiếp được coi như một cuộc gọi duy nhất, và chỉ cần một cuộc gọi UnlockOSThread để mở khóa luồng. Giờ đây, các cuộc gọi là lồng nhau: nhiều cuộc gọi LockOSThread đòi hỏi phải có cùng số lượng cuộc gọi UnlockOSThread để mở khóa. Mã hiện tại không sử dụng cuộc gọi lồng nhau vẫn hoạt động đúng. Phần lớn mã nguồn Go công khai sử dụng các hàm này thuộc loại thứ hai.

Do thường sử dụng LockOSThread và UnlockOSThread để cho phép mã nguồn Go sửa đổi đáng tin cậy trạng thái luồng cục bộ (như không gian tên Linux hoặc Plan 9). Thời gian chạy hiện coi các luồng bị khóa là không phù hợp để tái sử dụng hoặc tạo luồng mới. Thông tin ngăn xếp không còn chứa các hàm bọc ẩn (trước đây được đánh dấu là ). Kết quả là, số lần bỏ qua được truyền cho các hàm như Caller hiện nên khớp với cấu trúc mã đã viết, thay vì phụ thuộc vào quyết định tối ưu hóa và chi tiết thực hiện.

Bộ thu gom rác đã giảm tác động đến độ trễ phân bổ. Khi đang chạy, nó hiện sử dụng ít phần trăm CPU tổng thể hơn, nhưng có thể chạy lâu hơn. Tổng lượng CPU được sử dụng bởi bộ thu gom rác không thay đổi đáng kể.

Hàm GOROOT hiện thực sự được sử dụng sau khi chương trình được biên dịch, mặc định là GOROOT hoặc GOROOT_FINAL. Trước đây, nó được sử dụng sau khi chuỗi công cụ biên dịch chương trình được biên dịch, là GOROOT hoặc GOROOT_FINAL.

Giới hạn cài đặt GOMAXPROCS hiện không còn (ở Go 1.9, giới hạn là 1024).

4. Hiệu suất Như thường lệ, phiên bản này có phạm vi thay đổi rộng, khó đưa ra tuyên bố chính xác về hiệu suất. Do bộ thu gom rác nhanh hơn, mã hóa tốt hơn và tối ưu hóa thư viện cốt lõi, hầu hết các chương trình nên chạy nhanh hơn.

5. Bộ thu gom rác Khi bộ thu gom rác hoạt động, hầu hết các chương trình nên cảm nhận được độ trễ phân bổ thấp hơn và cải thiện hiệu suất tổng thể.

6. Thư viện cốt lõi Tất cả các thay đổi trong thư viện chuẩn đều nhỏ, nhưng các thay đổi trong gói bytes và net/url có thể yêu cầu cập nhật chương trình hiện tại.

Golang