Giới thiệu
Bắt đầu từ Go 1.21, bản phân phối Go gồm một lệnh go và một Go toolchain (bộ công cụ biên dịch) đi kèm, tức là thư viện chuẩn cùng với compiler, assembler và các công cụ khác. Lệnh go có thể dùng Go toolchain đi kèm của nó, cũng như các phiên bản khác mà nó tìm thấy trong PATH cục bộ hoặc tải về khi cần.
Việc chọn Go toolchain nào để dùng phụ thuộc vào cấu hình môi trường GOTOOLCHAIN và các dòng go và toolchain trong tệp go.mod của module chính hoặc tệp go.work của workspace hiện tại. Khi bạn di chuyển giữa các module chính và các workspace khác nhau, phiên bản toolchain được dùng có thể thay đổi, hệt như các phiên bản phụ thuộc của module.
Trong cấu hình chuẩn, lệnh go dùng toolchain đi kèm của chính nó khi toolchain đó mới ít nhất bằng dòng go hoặc toolchain trong module chính hoặc workspace. Ví dụ, khi dùng lệnh go đi kèm Go 1.21.3 trong một module chính ghi go 1.21.0, lệnh go sẽ dùng Go 1.21.3. Khi dòng go hoặc toolchain mới hơn toolchain đi kèm, lệnh go sẽ chạy toolchain mới hơn đó thay thế. Ví dụ, khi dùng lệnh go đi kèm Go 1.21.3 trong một module chính ghi go 1.21.9, lệnh go sẽ tìm và chạy Go 1.21.9 thay thế. Trước tiên nó tìm trong PATH một chương trình tên go1.21.9, nếu không có thì tải về và lưu cache một bản Go 1.21.9 toolchain. Việc tự động chuyển toolchain này có thể bị tắt, nhưng trong trường hợp đó, để đảm bảo tương thích tiến (forwards compatibility) chính xác hơn, lệnh go sẽ từ chối chạy trong một module chính hoặc workspace mà ở đó dòng go yêu cầu một phiên bản Go mới hơn. Nghĩa là dòng go đặt ra phiên bản Go tối thiểu bắt buộc phải có để dùng một module hoặc workspace.
Các module là phụ thuộc của module khác có thể cần đặt yêu cầu phiên bản Go tối thiểu thấp hơn toolchain ưa dùng khi làm việc trực tiếp trong module đó. Trong trường hợp này, dòng toolchain trong go.mod hoặc go.work đặt ra một toolchain ưa dùng, và nó được ưu tiên hơn dòng go khi lệnh go quyết định dùng toolchain nào.
Có thể xem các dòng go và toolchain như việc chỉ định yêu cầu phiên bản cho sự phụ thuộc của module vào chính Go toolchain, hệt như các dòng require trong go.mod chỉ định yêu cầu phiên bản cho các phụ thuộc vào module khác. Lệnh go get quản lý phụ thuộc Go toolchain y như cách nó quản lý phụ thuộc vào các module khác. Ví dụ, go get go@latest cập nhật module để yêu cầu Go toolchain đã phát hành mới nhất.
Cấu hình môi trường GOTOOLCHAIN có thể ép dùng một phiên bản Go cụ thể, ghi đè các dòng go và toolchain. Ví dụ, để test một package với Go 1.21rc3:
GOTOOLCHAIN=go1.21rc3 go test
Giá trị mặc định của GOTOOLCHAIN là auto, cho phép việc chuyển toolchain đã mô tả ở trên. Dạng thay thế <name>+auto đặt toolchain mặc định sẽ dùng trước khi quyết định có chuyển tiếp nữa hay không. Ví dụ GOTOOLCHAIN=go1.21.3+auto chỉ thị cho lệnh go bắt đầu quyết định với mặc định là dùng Go 1.21.3 nhưng vẫn dùng toolchain mới hơn nếu được các dòng go và toolchain chỉ định. Vì giá trị mặc định của GOTOOLCHAIN có thể thay đổi bằng go env -w, nếu bạn đã cài Go 1.21.0 hoặc mới hơn, thì
go env -w GOTOOLCHAIN=go1.21.3+auto
tương đương với việc thay bản cài Go 1.21.0 của bạn bằng Go 1.21.3.
Phần còn lại của tài liệu này giải thích chi tiết hơn về cách Go toolchain được đánh phiên bản, được chọn và được quản lý.
Các phiên bản Go
Các phiên bản Go đã phát hành dùng cú pháp phiên bản ‘1.N.P’, biểu thị bản phát hành thứ P của Go 1.N. Bản phát hành đầu tiên là 1.N.0, như trong ‘1.21.0’. Các bản sau như 1.N.9 thường được gọi là bản vá (patch release).
Các bản release candidate của Go 1.N, được phát hành trước 1.N.0, dùng cú pháp phiên bản ‘1.N_rc_R’. Bản release candidate đầu tiên của Go 1.N có phiên bản 1._N_rc1, như trong 1.23rc1.
Cú pháp ‘1.N’ được gọi là “phiên bản ngôn ngữ”. Nó biểu thị toàn bộ họ các bản phát hành Go hiện thực phiên bản đó của ngôn ngữ Go và thư viện chuẩn.
Phiên bản ngôn ngữ của một phiên bản Go là kết quả của việc cắt bỏ mọi thứ sau N: 1.21, 1.21rc2 và 1.21.3 đều hiện thực phiên bản ngôn ngữ 1.21.
Các Go toolchain đã phát hành như Go 1.21.0 và Go 1.21rc1 báo cáo đúng phiên bản cụ thể đó (ví dụ go1.21.0 hoặc go1.21rc1) qua go version và runtime.Version. Các Go toolchain chưa phát hành (vẫn đang phát triển) được build từ repository phát triển của Go thì chỉ báo cáo phiên bản ngôn ngữ (ví dụ go1.21).
Hai phiên bản Go bất kỳ đều có thể so sánh để quyết định cái nào nhỏ hơn, lớn hơn, hay bằng cái kia. Nếu phiên bản ngôn ngữ khác nhau, điều đó quyết định phép so sánh: 1.21.9 < 1.22. Trong cùng một phiên bản ngôn ngữ, thứ tự từ nhỏ đến lớn là: bản thân phiên bản ngôn ngữ, rồi tới các release candidate sắp theo R, rồi tới các bản phát hành sắp theo P.
Ví dụ, 1.21 < 1.21rc1 < 1.21rc2 < 1.21.0 < 1.21.1 < 1.21.2.
Trước Go 1.21, bản phát hành đầu tiên của một Go toolchain có phiên bản là 1.N, không phải 1.N.0, nên với N < 21, thứ tự được điều chỉnh để đặt 1.N sau các release candidate.
Ví dụ, 1.20rc1 < 1.20rc2 < 1.20rc3 < 1.20 < 1.20.1.
Các phiên bản Go trước đó còn có bản beta, với phiên bản như 1.18beta2. Các bản beta được đặt ngay trước các release candidate trong thứ tự phiên bản.
Ví dụ, 1.18beta1 < 1.18beta2 < 1.18rc1 < 1.18 < 1.18.1.
Tên của Go toolchain
Các Go toolchain chuẩn được đặt tên goV với V là một phiên bản Go biểu thị một bản beta, một release candidate, hoặc một bản phát hành. Ví dụ, go1.21rc1 và go1.21.0 là tên toolchain; go1.21 và go1.22 thì không (các bản phát hành đầu tiên là go1.21.0 và go1.22.0), nhưng go1.20 và go1.19 thì có.
Các toolchain không chuẩn dùng tên dạng goV-suffix với hậu tố bất kỳ.
Các toolchain được so sánh bằng cách so sánh phiên bản V nhúng trong tên (bỏ đi chữ go đứng đầu và loại bỏ mọi hậu tố bắt đầu bằng -). Ví dụ, go1.21.0 và go1.21.0-custom được coi là bằng nhau khi sắp thứ tự.
Cấu hình module và workspace
Các module và workspace của Go chỉ định cấu hình liên quan đến phiên bản trong tệp go.mod hoặc go.work của chúng.
Dòng go khai báo phiên bản Go tối thiểu bắt buộc để dùng module hoặc workspace đó. Vì lý do tương thích, nếu dòng go bị bỏ khỏi tệp go.mod, module được coi như có một dòng go 1.16 ngầm định, và nếu dòng go bị bỏ khỏi tệp go.work, workspace được coi như có một dòng go 1.18 ngầm định.
Dòng toolchain khai báo một toolchain được gợi ý để dùng với module hoặc workspace đó. Như mô tả trong “Chọn Go toolchain” bên dưới, lệnh go có thể chạy chính toolchain này khi làm việc trong module hoặc workspace đó nếu phiên bản của toolchain mặc định nhỏ hơn phiên bản của toolchain được gợi ý. Nếu dòng toolchain bị bỏ qua, module hoặc workspace được coi như có một dòng toolchain goV ngầm định, với V là phiên bản Go lấy từ dòng go.
Ví dụ, một go.mod ghi go 1.21.0 mà không có dòng toolchain được diễn giải như thể nó có dòng toolchain go1.21.0.
Go toolchain từ chối nạp một module hoặc workspace khai báo phiên bản Go tối thiểu bắt buộc lớn hơn phiên bản của chính toolchain đó.
Ví dụ, Go 1.21.2 sẽ từ chối nạp một module hoặc workspace có dòng go 1.21.3 hoặc go 1.22.
Dòng go của một module phải khai báo phiên bản lớn hơn hoặc bằng phiên bản go được khai báo bởi từng module liệt kê trong các câu lệnh require. Dòng go của một workspace phải khai báo phiên bản lớn hơn hoặc bằng phiên bản go được khai báo bởi từng module liệt kê trong các câu lệnh use.
Ví dụ, nếu module M yêu cầu một phụ thuộc D có go.mod khai báo go 1.22.0, thì go.mod của M không thể ghi go 1.21.3.
Dòng go của mỗi module đặt ra phiên bản ngôn ngữ mà compiler áp dụng khi biên dịch các package trong module đó. Phiên bản ngôn ngữ có thể được đổi trên từng tệp bằng cách dùng build constraint: nếu có một build constraint và nó ngụ ý một phiên bản tối thiểu ít nhất là go1.21, thì phiên bản ngôn ngữ dùng khi biên dịch tệp đó sẽ là phiên bản tối thiểu ấy.
Ví dụ, một module chứa mã nguồn dùng phiên bản ngôn ngữ Go 1.21 nên có tệp go.mod với dòng go như go 1.21 hoặc go 1.21.3. Nếu một tệp mã nguồn cụ thể chỉ nên được biên dịch khi dùng Go toolchain mới hơn, thêm //go:build go1.22 vào tệp đó vừa bảo đảm chỉ Go 1.22 và các toolchain mới hơn mới biên dịch tệp này, vừa đổi phiên bản ngôn ngữ trong tệp đó thành Go 1.22.
Cách thuận tiện và an toàn nhất để sửa các dòng go và toolchain là dùng go get; xem phần dành riêng cho go get bên dưới.
Trước Go 1.21, các Go toolchain coi dòng go như một yêu cầu mang tính khuyến nghị: nếu build thành công thì toolchain giả định mọi thứ đều ổn, còn nếu không thì nó in ra một ghi chú về khả năng lệch phiên bản. Go 1.21 đã đổi dòng go thành một yêu cầu bắt buộc. Hành vi này được backport một phần về các phiên bản ngôn ngữ cũ hơn: các bản Go 1.19 từ Go 1.19.13 trở đi và các bản Go 1.20 từ Go 1.20.8 trở đi từ chối nạp workspace hoặc module khai báo phiên bản Go 1.22 trở lên.
Trước Go 1.21, các toolchain không yêu cầu một module hoặc workspace phải có dòng go lớn hơn hoặc bằng phiên bản go mà từng module phụ thuộc của nó yêu cầu.
Cấu hình GOTOOLCHAIN
Lệnh go chọn Go toolchain để dùng dựa trên cấu hình GOTOOLCHAIN. Để tìm giá trị của GOTOOLCHAIN, lệnh go dùng các quy tắc chuẩn áp dụng cho mọi cấu hình môi trường của Go:
-
Nếu
GOTOOLCHAINđược đặt một giá trị khác rỗng trong môi trường tiến trình (truy vấn bằngos.Getenv), lệnhgodùng giá trị đó. -
Nếu không, nếu
GOTOOLCHAINđược đặt trong tệp mặc định môi trường của người dùng (quản lý bằnggo env -wvàgo env -u), lệnhgodùng giá trị đó. -
Nếu không, nếu
GOTOOLCHAINđược đặt trong tệp mặc định môi trường của Go toolchain đi kèm ($GOROOT/go.env), lệnhgodùng giá trị đó.
Trong các Go toolchain chuẩn, tệp $GOROOT/go.env đặt mặc định GOTOOLCHAIN=auto, nhưng các Go toolchain được đóng gói lại có thể thay đổi giá trị này.
Nếu tệp $GOROOT/go.env bị thiếu hoặc không đặt giá trị mặc định, lệnh go giả định GOTOOLCHAIN=local.
Chạy go env GOTOOLCHAIN sẽ in ra giá trị của GOTOOLCHAIN.
Chọn Go toolchain
Khi khởi động, lệnh go chọn Go toolchain nào sẽ dùng. Nó tham chiếu cấu hình GOTOOLCHAIN, vốn có dạng <name>, <name>+auto, hoặc <name>+path. GOTOOLCHAIN=auto là viết tắt của GOTOOLCHAIN=local+auto; tương tự, GOTOOLCHAIN=path là viết tắt của GOTOOLCHAIN=local+path. Phần <name> đặt ra Go toolchain mặc định: local chỉ Go toolchain đi kèm (cái được phát hành cùng lệnh go đang chạy), còn không thì <name> phải là một tên Go toolchain cụ thể, chẳng hạn go1.21.0. Lệnh go ưu tiên chạy Go toolchain mặc định. Như đã nói ở trên, bắt đầu từ Go 1.21, các Go toolchain từ chối chạy trong workspace hoặc module yêu cầu phiên bản Go mới hơn. Thay vào đó, chúng báo lỗi và thoát.
Khi GOTOOLCHAIN được đặt là local, lệnh go luôn chạy Go toolchain đi kèm.
Khi GOTOOLCHAIN được đặt là <name> (ví dụ GOTOOLCHAIN=go1.21.0), lệnh go luôn chạy đúng Go toolchain cụ thể đó. Nếu tìm thấy một binary mang tên đó trong PATH của hệ thống, lệnh go sẽ dùng nó. Nếu không, lệnh go dùng một Go toolchain mà nó tải về và xác minh.
Khi GOTOOLCHAIN được đặt là <name>+auto hoặc <name>+path (hoặc viết tắt auto hay path), lệnh go chọn và chạy một phiên bản Go mới hơn khi cần. Cụ thể, nó tham chiếu các dòng toolchain và go trong tệp go.work của workspace hiện tại, hoặc khi không có workspace thì tệp go.mod của module chính. Nếu tệp go.work hoặc go.mod có dòng toolchain <tname> và <tname> mới hơn Go toolchain mặc định, thì lệnh go chạy <tname> thay thế. Nếu tệp có dòng toolchain default, thì lệnh go chạy Go toolchain mặc định, vô hiệu hoá mọi nỗ lực nâng cấp vượt quá <name>. Nếu không, nếu tệp có dòng go <version> và <version> mới hơn Go toolchain mặc định, thì lệnh go chạy go<version> thay thế.
Để chạy một toolchain khác với Go toolchain đi kèm, lệnh go tìm trong đường dẫn thực thi của tiến trình ($PATH trên Unix và Plan 9, %PATH% trên Windows) một chương trình có tên tương ứng (ví dụ go1.21.3) rồi chạy chương trình đó. Nếu không tìm thấy chương trình nào như vậy, lệnh go tải về và chạy Go toolchain được chỉ định. Dùng dạng <name>+path của GOTOOLCHAIN sẽ vô hiệu hoá phương án dự phòng là tải về, khiến lệnh go dừng lại sau khi tìm trong đường dẫn thực thi.
Chạy go version sẽ in phiên bản của Go toolchain được chọn (bằng cách chạy hiện thực go version của chính toolchain được chọn).
Chạy GOTOOLCHAIN=local go version sẽ in phiên bản của Go toolchain đi kèm.
Bắt đầu từ Go 1.24, bạn có thể theo dõi quá trình chọn toolchain của lệnh go bằng cách thêm toolchaintrace=1 vào biến môi trường GODEBUG khi bạn chạy lệnh go.
Chuyển đổi Go toolchain
Với hầu hết các lệnh, tệp go.work của workspace hoặc go.mod của module chính sẽ có dòng go mới ít nhất bằng dòng go trong mọi module phụ thuộc, nhờ các yêu cầu cấu hình về thứ tự phiên bản. Trong trường hợp này, việc chọn toolchain lúc khởi động sẽ chạy một Go toolchain đủ mới để hoàn tất lệnh.
Một số lệnh đưa thêm các phiên bản module mới vào như một phần hoạt động của chúng: go get thêm phụ thuộc module mới vào module chính; go work use thêm module cục bộ mới vào workspace; go work sync đồng bộ lại workspace với các module cục bộ có thể đã được cập nhật kể từ khi workspace được tạo; go install package@version và go run package@version thực chất chạy trong một module chính rỗng và thêm package@version như một phụ thuộc mới. Tất cả các lệnh này đều có thể gặp một module có dòng go trong go.mod yêu cầu phiên bản Go mới hơn phiên bản Go đang chạy.
Khi một lệnh gặp một module yêu cầu phiên bản Go mới hơn và GOTOOLCHAIN cho phép chạy toolchain khác (nó ở một trong các dạng auto hoặc path), lệnh go chọn và chuyển sang một toolchain mới hơn phù hợp để tiếp tục thực thi lệnh hiện tại.
Mỗi khi lệnh go chuyển toolchain sau bước chọn toolchain lúc khởi động, nó in ra một thông báo giải thích lý do. Ví dụ:
go: module example.com/[email protected] requires go >= 1.24rc1; switching to go 1.27.9
Như trong ví dụ, lệnh go có thể chuyển sang một toolchain mới hơn yêu cầu mà nó phát hiện được. Nhìn chung lệnh go hướng tới việc chuyển sang một Go toolchain còn được hỗ trợ.
Để chọn toolchain, trước tiên lệnh go lấy danh sách các toolchain khả dụng. Với dạng auto, lệnh go tải về một danh sách các toolchain khả dụng. Với dạng path, lệnh go quét PATH để tìm mọi tệp thực thi có tên là tên toolchain hợp lệ và dùng danh sách tất cả toolchain mà nó tìm thấy. Dựa trên danh sách toolchain đó, lệnh go xác định tối đa ba ứng viên:
- release candidate mới nhất của một phiên bản ngôn ngữ Go chưa phát hành (1._N_₃rc_R_₃),
- bản vá mới nhất của phiên bản ngôn ngữ Go được phát hành gần đây nhất (1._N_₂._P_₂), và
- bản vá mới nhất của phiên bản ngôn ngữ Go trước đó (1._N_₁._P_₁).
Đây là các bản phát hành Go được hỗ trợ theo chính sách phát hành của Go. Nhất quán với minimal version selection, lệnh go sau đó chọn một cách thận trọng ứng viên có phiên bản nhỏ nhất (cũ nhất) mà vẫn thoả mãn yêu cầu mới.
Ví dụ, giả sử example.com/[email protected] yêu cầu Go 1.24rc1 trở lên. Lệnh go lấy danh sách các toolchain khả dụng và thấy rằng các bản vá mới nhất của hai Go toolchain gần đây nhất là Go 1.28.3 và Go 1.27.9, đồng thời release candidate Go 1.29rc2 cũng có sẵn. Trong tình huống này, lệnh go sẽ chọn Go 1.27.9. Nếu widget yêu cầu Go 1.28 trở lên, lệnh go sẽ chọn Go 1.28.3, vì Go 1.27.9 quá cũ. Nếu widget yêu cầu Go 1.29 trở lên, lệnh go sẽ chọn Go 1.29rc2, vì cả Go 1.27.9 lẫn Go 1.28.3 đều quá cũ.
Các lệnh đưa thêm phiên bản module mới vốn yêu cầu phiên bản Go mới sẽ ghi yêu cầu phiên bản go tối thiểu mới vào tệp go.work của workspace hiện tại hoặc tệp go.mod của module chính, cập nhật dòng go. Vì tính lặp lại được, mọi lệnh cập nhật dòng go cũng cập nhật dòng toolchain để ghi lại tên toolchain của chính nó. Lần tiếp theo lệnh go chạy trong workspace hoặc module đó, nó sẽ dùng dòng toolchain đã cập nhật ấy trong bước chọn toolchain.
Ví dụ, go get example.com/[email protected] có thể in ra thông báo chuyển đổi như ở trên và chuyển sang Go 1.27.9. Go 1.27.9 sẽ hoàn tất lệnh go get và cập nhật dòng toolchain thành toolchain go1.27.9. Lệnh go chạy tiếp theo trong module hoặc workspace đó sẽ chọn go1.27.9 khi khởi động và sẽ không in thông báo chuyển đổi nào.
Nhìn chung, nếu một lệnh go bất kỳ được chạy hai lần, nếu lần đầu in ra thông báo chuyển đổi thì lần thứ hai sẽ không, bởi lần đầu cũng đã cập nhật go.work hoặc go.mod để chọn đúng toolchain lúc khởi động. Ngoại lệ là các dạng go install package@version và go run package@version, vốn chạy ngoài mọi workspace hay module chính nên không thể ghi dòng toolchain. Chúng in thông báo chuyển đổi mỗi lần cần chuyển sang toolchain mới hơn.
Tải về toolchain
Khi dùng GOTOOLCHAIN=auto hoặc GOTOOLCHAIN=<name>+auto, lệnh Go tải về các toolchain mới hơn khi cần. Các toolchain này được đóng gói dưới dạng module đặc biệt với module path golang.org/toolchain và phiên bản v0.0.1-goVERSION.GOOS-GOARCH. Toolchain được tải về như mọi module khác, nghĩa là việc tải toolchain có thể đi qua proxy bằng cách đặt GOPROXY và được kiểm tra checksum bởi cơ sở dữ liệu checksum của Go. Vì toolchain cụ thể được dùng phụ thuộc vào toolchain mặc định của chính hệ thống cũng như hệ điều hành và kiến trúc cục bộ (GOOS và GOARCH), nên việc ghi checksum của module toolchain vào go.sum là không thực tế. Thay vào đó, việc tải toolchain sẽ thất bại vì thiếu xác minh nếu GOSUMDB=off. Các mẫu GOPRIVATE và GONOSUMDB không áp dụng cho việc tải toolchain.
Quản lý yêu cầu phiên bản Go của module bằng go get
Nhìn chung lệnh go coi các dòng go và toolchain như việc khai báo các phụ thuộc toolchain có đánh phiên bản của module chính. Lệnh go get có thể quản lý các dòng này hệt như nó quản lý các dòng require vốn chỉ định các phụ thuộc module có đánh phiên bản.
Ví dụ, go get [email protected] [email protected] đổi tệp go.mod của module chính thành go 1.22.1 và toolchain go1.24rc1.
Lệnh go hiểu rằng phụ thuộc go đòi hỏi một phụ thuộc toolchain có phiên bản Go lớn hơn hoặc bằng.
Tiếp tục ví dụ trên, một lệnh go get [email protected] chạy sau đó cũng sẽ cập nhật toolchain lên go1.25.0. Khi toolchain khớp chính xác với dòng go, nó có thể được bỏ đi và ngầm hiểu, nên lệnh go get này sẽ xoá dòng toolchain.
Yêu cầu tương tự cũng áp dụng theo chiều ngược lại khi hạ phiên bản: nếu go.mod ban đầu là go 1.22.1 và toolchain go1.24rc1, thì go get [email protected] sẽ chỉ cập nhật dòng toolchain, nhưng go get [email protected] sẽ hạ cả dòng go xuống go 1.21.3. Kết quả là chỉ còn lại go 1.21.3 mà không có dòng toolchain.
Dạng đặc biệt toolchain@none nghĩa là xoá mọi dòng toolchain, như trong go get toolchain@none hoặc go get [email protected] toolchain@none.
Lệnh go hiểu cú pháp phiên bản cho các phụ thuộc go và toolchain cũng như cho các truy vấn.
Ví dụ, hệt như go get example.com/[email protected] dùng phiên bản v1.2 mới nhất của example.com/widget (có thể là v1.2.3), go get [email protected] dùng bản phát hành khả dụng mới nhất của phiên bản ngôn ngữ Go 1.22 (có thể là 1.22rc3, hoặc có thể là 1.22.3). Điều tương tự áp dụng cho go get [email protected].
Các lệnh go get và go mod tidy duy trì dòng go sao cho lớn hơn hoặc bằng dòng go của mọi module phụ thuộc bắt buộc.
Ví dụ, nếu module chính có go 1.22.1 và chúng tôi chạy go get example.com/[email protected] vốn khai báo go 1.24rc1, thì go get sẽ cập nhật dòng go của module chính thành go 1.24rc1.
Tiếp tục ví dụ trên, một lệnh go get [email protected] chạy sau đó sẽ hạ example.com/widget xuống một phiên bản tương thích với Go 1.22.1 hoặc loại bỏ hẳn yêu cầu đó, hệt như khi hạ phiên bản bất kỳ phụ thuộc nào khác của example.com/widget.
Trước Go 1.21, cách được khuyến nghị để cập nhật một module lên phiên bản Go mới (chẳng hạn Go 1.22) là go mod tidy -go=1.22, nhằm bảo đảm mọi điều chỉnh riêng cho Go 1.22 được thực hiện với go.mod cùng lúc với việc dòng go được cập nhật. Dạng đó vẫn hợp lệ, nhưng go get [email protected] đơn giản hơn nay được ưa dùng hơn.
Khi go get được chạy trong một module nằm trong thư mục thuộc gốc của một workspace, go get phần lớn bỏ qua workspace, nhưng nó vẫn cập nhật tệp go.work để nâng cấp dòng go khi nếu không làm vậy thì workspace sẽ bị bỏ lại với dòng go quá cũ.
Quản lý yêu cầu phiên bản Go của workspace bằng go work
Như đã nói ở phần trước, go get chạy trong một thư mục nằm trong gốc workspace sẽ lo cập nhật dòng go của tệp go.work khi cần, sao cho nó lớn hơn hoặc bằng mọi module bên trong gốc đó. Tuy nhiên, workspace cũng có thể tham chiếu các module nằm ngoài thư mục gốc; chạy go get trong những thư mục đó có thể dẫn tới một cấu hình workspace không hợp lệ, trong đó phiên bản go khai báo trong go.work nhỏ hơn một hoặc nhiều module trong các chỉ thị use.
Lệnh go work use, vốn thêm các chỉ thị use mới, cũng kiểm tra rằng phiên bản go trong tệp go.work đủ mới cho tất cả các chỉ thị use hiện có. Để cập nhật một workspace có phiên bản go bị lệch pha với các module của nó, hãy chạy go work use không kèm đối số.
Các lệnh go work init và go work sync cũng cập nhật phiên bản go khi cần.
Để xoá dòng toolchain khỏi tệp go.work, dùng go work edit -toolchain=none.