الانتقال إلى المحتوى الرئيسي
الوحدة 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)

العلامات المضمنة الأكثر شيوعًا:

  • نظام التشغيل: 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جارٍ التحميل…

في الجزء العلوي من الملف، قم بإضافة قيد البناء الذي يجمعه فقط على نظام التشغيل Linux. تذكر السطر الفارغ قبل الحزمة.

جارٍ تحميل المحرر…
إظهار التلميح

يتم وضع التعليق //go:build قبل الحزمة، على سطر بمفرده، متبوعًا بسطر فارغ.

الحل متاح بعد 3 من المحاولات

تمرين#go.m9.l5.e2
المحاولات: 0جارٍ التحميل…

أضف قيد بناء يستثني Windows (استخدم عامل النفي!).

جارٍ تحميل المحرر…

الحل متاح بعد 3 من المحاولات

Quiz#go.m9.l5.e3
جاهز

لتمكين علامة "تكامل" مخصصة تم الإعلان عنها باستخدام //go:build التكامل في وقت الاختبار، ما العلامة التي تستخدمها؟

Go
$ go test -tags=???
خيارات الإجابة