Bài học theo mô-đun (5/5)
Xây dựng các ràng buộc và thẻ
Ràng buộc xây dựng (còn gọi là thẻ xây dựng) cổng biên dịch tệp dựa trên hệ điều hành, kiến trúc, phiên bản Go hoặc thẻ tùy chỉnh được truyền trên dòng lệnh. Chúng được sử dụng cho mã đa nền tảng, chọn tham gia các tệp thử nghiệm nặng và các tình huống tương tự.
Cú pháp hiện đại: //go:build
Vì Go 1.17+ nên định dạng chuẩn là nhận xét đặc biệt //go:build, được đặt ở đầu tệp trước package, trên chính một dòng, theo sau là một dòng trống:
//go:build linux
package main
// this file is built ONLY on LinuxBa quy tắc tuyệt đối:
- Nhận xét phải xuất hiện trước
package. - Theo sau nó phải là một dòng trống.
- Không có khoảng cách giữa
//vàgo:build(đây là trình kích hoạt cú pháp, không phải bất kỳ nhận xét nào).
biểu thức Boolean
Biểu thức sau //go:build chấp nhận các toán tử logic:
//go:build linux && amd64 // both conditions
//go:build linux || darwin // any one (Unix-like)
//go:build !windows // negation
//go:build (linux || darwin) && !arm64
//go:build go1.22 // Go version ≥ 1.22
//go:build integration // custom tag (see below)Các thẻ tích hợp phổ biến nhất:
- OS:
linux,darwin,windows,freebsd,js... - Kiến trúc:
amd64,arm64,386,wasm... - Phiên bản Go:
go1.20,go1.22... (đúng nếu phiên bản là ≥). cgo: đúng nếu cgo được bật.
Đa nền tảng: quy ước tên tệp
Ngoài các thẻ rõ ràng, Go còn nhận ra hậu tố tên tệp là các ràng buộc xây dựng ngầm định:
db_linux.go // linux only
db_windows.go // windows only
db_linux_amd64.go // linux/amd64 only
Đây là mẫu thành ngữ để triển khai phụ thuộc vào nền tảng của cùng một giao diện (mỗi tệp xác định các chức năng giống nhau với mã khác nhau).
Thẻ tùy chỉnh: chọn tham gia các bài kiểm tra nặng
Thẻ tùy chỉnh là bất kỳ mã định danh nào bạn chuyển qua dòng lệnh:
//go:build integration
package mypkg
// tests that need a real DB, run only on demandThực thi:
go test -tags=integration ./...Nếu không có -tags=integration, tệp sẽ không hiển thị với trình biên dịch (các bài kiểm tra bên trong tệp không tồn tại đối với go test). Đó là cách kinh điển để tách các bài kiểm tra đơn vị (luôn luôn) khỏi các bài kiểm tra tích hợp (theo yêu cầu, có thể chỉ trong CI).
Cú pháp cũ: // +build (không dùng nữa)
Trước phiên bản 1.17, định dạng là // +build linux (lưu ý khoảng trắng và đó là +build, không phải go:build). Nó vẫn được hỗ trợ để tương thích ngược, nhưng gofmt trong Go 1.17+ thêm cả hai khi nó chỉ tìm thấy cái cũ:
//go:build linux
// +build linux
package mainĐối với các tệp mới, chỉ sử dụng biểu mẫu //go:build hiện đại.
Bài tập
Ở đầu tệp thêm ràng buộc xây dựng để biên dịch nó CHỈ trên Linux. Hãy nhớ dòng trống trước gói.
Hiển thị gợi ý
Nhận xét //go:build xuất hiện TRƯỚC gói, trên một dòng, theo sau là một dòng trống.
Giải pháp khả dụng sau 3 lần thử
Thêm một ràng buộc xây dựng LOẠI TRỪ Windows (sử dụng toán tử phủ định !).
Giải pháp khả dụng sau 3 lần thử
Để bật thẻ 'tích hợp' tùy chỉnh tại thời điểm thử nghiệm được khai báo bằng //go:build tích hợp, bạn sử dụng cờ nào?
$ go test -tags=???