שיעורי מודול (5/5)
בניית אילוצים ותגים
אילוצי בנייה (הנקראים גם תגיות בנייה) משדרים את הידור הקובץ המבוסס על מערכת הפעלה, ארכיטקטורה, גרסת Go או תגים מותאמים אישית שהועברו בשורת הפקודה. הם משמשים לקוד חוצה פלטפורמות, קבצי בדיקה כבדים להצטרפות ותרחישים דומים.
תחביר מודרני: //go:build
מאז Go 1.17+ הפורמט הקנוני הוא ההערה המיוחדת //go:build, המוצבת בראש הקובץ לפני package, בשורה בפני עצמה, ואחריה שורה ריקה:
//go:build linux
package main
// this file is built ONLY on Linuxשלושה כללים מוחלטים:
- התגובה חייבת להופיע לפני
package. - יש להופיע אחריו שורה ריקה.
- אין רווח בין
//ל-go:build(זהו טריגר תחבירי, לא סתם הערה).
ביטויים בוליאניים
הביטוי שאחרי //go:build מקבל אופרטורים לוגיים:
//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 מזהה סיומות של שמות קבצים כאילוצי בנייה מרומזים:
db_linux.go // linux only
db_windows.go // windows only
db_linux_amd64.go // linux/amd64 only
זהו התבנית האידיומטית למימושים תלויי פלטפורמה של אותו ממשק (כל קובץ מגדיר את אותן פונקציות עם קוד שונה).
תגים מותאמים אישית: הצטרפות לבדיקות כבדות
תגים מותאמים אישית הם כל מזהה שאתה מעביר בשורת הפקודה:
//go:build integration
package mypkg
// tests that need a real DB, run only on demandהוֹצָאָה לְפוֹעַל:
go test -tags=integration ./...ללא -tags=integration, הקובץ אינו נראה לקומפיילר (הבדיקות שבתוכו לא קיימות עבור go test). זוהי הדרך הקנונית להפריד בין מבחני יחידה (תמיד) לבין מבחני אינטגרציה (על פי דרישה, אולי רק ב-CI).
תחביר ישן: // +build (הוצא משימוש)
לפני 1.17 הפורמט היה // +build linux (שימו לב לרווח, ושהוא +build, לא go:build). זה עדיין נתמך עבור תאימות לאחור, אבל gofmt ב-Go 1.17+ מוסיף את שניהם כאשר הוא מוצא רק את הישן:
//go:build linux
// +build linux
package mainעבור קבצים חדשים השתמש רק בטופס המודרני //go:build.
תרגילים
בראש הקובץ הוסף את אילוץ הבנייה שמרכיב אותו רק בלינוקס. זכור את השורה הריקה לפני החבילה.
הצג רמז
הערה //go:build עוברת חבילת BEFORE, על שורה בפני עצמה, ואחריה שורה ריקה.
הפתרון זמין לאחר 3 ניסיונות
הוסף אילוץ בנייה שלא כולל את Windows (השתמש באופרטור השלילה !).
הפתרון זמין לאחר 3 ניסיונות
כדי לאפשר בזמן הבדיקה תג 'אינטגרציה' מותאם אישית המוצהר עם //go:build שילוב, באיזה דגל אתה משתמש?
$ go test -tags=???