Chuyển đến nội dung chính
Mô-đun 9 · Bài học 5 trong tổng số 545/50 trong khóa học~10 min
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
//go:build linux

package main

// this file is built ONLY on Linux

Ba quy tắc tuyệt đối:

  1. Nhận xét phải xuất hiện trước package.
  2. Theo sau nó phải là một dòng trống.
  3. 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
//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:

Code
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
//go:build integration

package mypkg

// tests that need a real DB, run only on demand

Thực thi:

Bash
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
//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

tập thể dục#go.m9.l5.e1
Nỗ lực: 0Đang tải…

Ở đầ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.

Đang tải trình chỉnh sửa…
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ử

tập thể dục#go.m9.l5.e2
Nỗ lực: 0Đang tải…

Thêm một ràng buộc xây dựng LOẠI TRỪ Windows (sử dụng toán tử phủ định !).

Đang tải trình chỉnh sửa…

Giải pháp khả dụng sau 3 lần thử

Quiz#go.m9.l5.e3
Sẵn sàng

Để 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
$ go test -tags=???
Tùy chọn trả lời