মূল কন্টেন্টে যান
মডিউল 9 · 5-এর পাঠ 5কোর্সে 45/50~10 min
মডিউল পাঠ (5/5)

সীমাবদ্ধতা এবং ট্যাগ তৈরি করুন

বিল্ড সীমাবদ্ধতা (বিল্ড ট্যাগও বলা হয়) ওএস, আর্কিটেকচার, গো সংস্করণ বা কমান্ড লাইনে পাস করা কাস্টম ট্যাগের উপর ভিত্তি করে একটি ফাইলের সংকলন গেট করে। এগুলি ক্রস-প্ল্যাটফর্ম কোড, অপ্ট-ইন ভারী পরীক্ষার ফাইল এবং অনুরূপ পরিস্থিতিতে ব্যবহার করা হয়।

আধুনিক সিনট্যাক্স: //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...
  • সংস্করণে যান: 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 এর জন্য বিদ্যমান নেই)। ইউনিট পরীক্ষাগুলিকে (সর্বদা) ইন্টিগ্রেশন পরীক্ষা (চাহিদা অনুযায়ী, শুধুমাত্র সিআই-তে) থেকে আলাদা করার আদর্শ উপায়।

পুরানো সিনট্যাক্স: // +build (অপ্রচলিত)

1.17 এর আগে বিন্যাসটি ছিল // +build linux (স্পেসটি মনে রাখবেন, এবং এটি +build, go:build নয়)। এটি এখনও পশ্চাদগামী সামঞ্জস্যের জন্য সমর্থিত, কিন্তু Go 1.17+ এ gofmt উভয়ই যোগ করে যখন এটি শুধুমাত্র পুরানোটিকে খুঁজে পায়:

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 integration এর সাথে একটি কাস্টম 'ইন্টিগ্রেশন' ট্যাগ ঘোষিত হয়, আপনি কোন পতাকা ব্যবহার করেন?

Go
$ go test -tags=???
উত্তরের বিকল্প