דילוג לתוכן המרכזי
מודול 9 · שיעור 5 מתוך 545/50 בקורס~10 min
שיעורי מודול (5/5)

בניית אילוצים ותגים

אילוצי בנייה (הנקראים גם תגיות בנייה) משדרים את הידור הקובץ המבוסס על מערכת הפעלה, ארכיטקטורה, גרסת Go או תגים מותאמים אישית שהועברו בשורת הפקודה. הם משמשים לקוד חוצה פלטפורמות, קבצי בדיקה כבדים להצטרפות ותרחישים דומים.

תחביר מודרני: //go:build

מאז Go 1.17+ הפורמט הקנוני הוא ההערה המיוחדת //go:build, המוצבת בראש הקובץ לפני package, בשורה בפני עצמה, ואחריה שורה ריקה:

Go
//go:build linux

package main

// this file is built ONLY on Linux

שלושה כללים מוחלטים:

  1. התגובה חייבת להופיע לפני package.
  2. יש להופיע אחריו שורה ריקה.
  3. אין רווח בין // ל-go:build (זהו טריגר תחבירי, לא סתם הערה).

ביטויים בוליאניים

הביטוי שאחרי //go:build מקבל אופרטורים לוגיים:

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)

התגים המובנים הנפוצים ביותר:

  • OS: linux, darwin, windows, freebsd, js...
  • אדריכלות: amd64, arm64, 386, wasm...
  • גרסת Go: go1.20, go1.22... (נכון אם הגרסה היא ≥).
  • cgo: נכון אם cgo מופעל.

חוצה פלטפורמות: מוסכמה של שמות קבצים

מעבר לתגים מפורשים, Go מזהה סיומות של שמות קבצים כאילוצי בנייה מרומזים:

Code
db_linux.go         // linux only
db_windows.go       // windows only
db_linux_amd64.go   // linux/amd64 only

זהו התבנית האידיומטית למימושים תלויי פלטפורמה של אותו ממשק (כל קובץ מגדיר את אותן פונקציות עם קוד שונה).

תגים מותאמים אישית: הצטרפות לבדיקות כבדות

תגים מותאמים אישית הם כל מזהה שאתה מעביר בשורת הפקודה:

Go
//go:build integration

package mypkg

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

הוֹצָאָה לְפוֹעַל:

Bash
go test -tags=integration ./...

ללא -tags=integration, הקובץ אינו נראה לקומפיילר (הבדיקות שבתוכו לא קיימות עבור go test). זוהי הדרך הקנונית להפריד בין מבחני יחידה (תמיד) לבין מבחני אינטגרציה (על פי דרישה, אולי רק ב-CI).

תחביר ישן: // +build (הוצא משימוש)

לפני 1.17 הפורמט היה // +build linux (שימו לב לרווח, ושהוא +build, לא go:build). זה עדיין נתמך עבור תאימות לאחור, אבל gofmt ב-Go 1.17+ מוסיף את שניהם כאשר הוא מוצא רק את הישן:

Go
//go:build linux
// +build linux

package main

עבור קבצים חדשים השתמש רק בטופס המודרני //go:build.

תרגילים

פעילות גופנית#go.m9.l5.e1
ניסיונות: 0טוען...

בראש הקובץ הוסף את אילוץ הבנייה שמרכיב אותו רק בלינוקס. זכור את השורה הריקה לפני החבילה.

טוען עורך...
הצג רמז

הערה //go:build עוברת חבילת BEFORE, על שורה בפני עצמה, ואחריה שורה ריקה.

הפתרון זמין לאחר 3 ניסיונות

פעילות גופנית#go.m9.l5.e2
ניסיונות: 0טוען...

הוסף אילוץ בנייה שלא כולל את Windows (השתמש באופרטור השלילה !).

טוען עורך...

הפתרון זמין לאחר 3 ניסיונות

Quiz#go.m9.l5.e3
מוכן

כדי לאפשר בזמן הבדיקה תג 'אינטגרציה' מותאם אישית המוצהר עם //go:build שילוב, באיזה דגל אתה משתמש?

Go
$ go test -tags=???
אפשרויות תשובה