मुख्य सामग्री पर जाएं
मॉड्यूल 9 · पाठ 5 का 5पाठ्यक्रम में 45/50~10 min
मॉड्यूल पाठ (5/5)

बाधाएं और टैग बनाएं

बिल्ड बाधाएं (जिन्हें बिल्ड टैग भी कहा जाता है) ओएस, आर्किटेक्चर, गो संस्करण या कमांड लाइन पर पारित कस्टम टैग के आधार पर फ़ाइल के संकलन को गेट करते हैं। इनका उपयोग क्रॉस-प्लेटफ़ॉर्म कोड, ऑप्ट-इन हेवी टेस्ट फ़ाइलों और इसी तरह के परिदृश्यों के लिए किया जाता है।

आधुनिक वाक्यविन्यास: //go:build

गो 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...
  • गो संस्करण: go1.20, go1.22... (यदि संस्करण ** ≥** है तो सत्य है)।
  • cgo: यदि cgo सक्षम है तो सत्य है।

क्रॉस-प्लेटफ़ॉर्म: फ़ाइल नाम कन्वेंशन

स्पष्ट टैग से परे, गो फ़ाइल नाम प्रत्यय को अंतर्निहित निर्माण बाधाओं के रूप में पहचानता है:

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 के लिए मौजूद नहीं हैं)। यह यूनिट परीक्षणों (हमेशा) को एकीकरण परीक्षणों (मांग पर, शायद केवल सीआई में) से अलग करने का विहित तरीका है।

पुराना सिंटैक्स: // +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 टिप्पणी पैकेज से पहले जाती है, एक लाइन पर, उसके बाद एक खाली लाइन पर।

3 प्रयासों के बाद समाधान उपलब्ध है

व्यायाम#go.m9.l5.e2
प्रयास: 0लोड हो रहा है...

एक बिल्ड बाधा जोड़ें जो विंडोज़ को बाहर कर दे (नेगेशन ऑपरेटर का उपयोग करें!)।

संपादक लोड हो रहा है...

3 प्रयासों के बाद समाधान उपलब्ध है

Quiz#go.m9.l5.e3
तैयार

परीक्षण के समय //go:build एकीकरण के साथ घोषित कस्टम 'एकीकरण' टैग को सक्षम करने के लिए, आप किस ध्वज का उपयोग करते हैं?

Go
$ go test -tags=???
उत्तर विकल्प