فاز ۰: راهاندازی و طرز فکر Go · درس ۱
نصب toolchain و اولین برنامه
Go را نصب میکنید، اولین برنامه را مینویسید و میبینید چرا خروجی آن یک فایل اجرایی مستقل است، نه کدی که به مفسر نیاز دارد.
در این صفحه
هدف
در پایان این درس:
- Go روی سیستم شما نصب است و میدانید هر بخش آن کجا قرار میگیرد.
- اولین برنامه را با
go runاجرا و باgo buildبه فایل اجرایی تبدیل کردهاید. - میدانید چرا تحویل یک سرویس Go به سرور با تحویل یک پروژهٔ Django فرق اساسی دارد.
در Django برای اجرای پروژه روی سرور به مفسر Python، یک محیط مجازی و همهٔ بستههای نصبشده نیاز دارید. در Go خروجی کار یک فایل است که آن را کپی و اجرا میکنید. همین تفاوت، شکل Dockerfile، سرعت بالا آمدن سرویس و روش انتشار را عوض میکند.
مفهوم
toolchain چیست
toolchain (زنجیرهٔ ابزار) مجموعهای است که با نصب Go میگیرید: کامپایلر، linker (پیونددهنده)، کتابخانهٔ استاندارد و دستور go که همهٔ اینها را هدایت میکند. برخلاف Python که برای قالببندی، تست و مدیریت بسته به ابزارهای جدا مثل ruff، pytest و uv نیاز دارید، در Go همهٔ این کارها زیردستورهای همان go هستند.
نصب
دانلود و نصب
بستهٔ سیستمعامل خودتان را از
go.dev/dlبگیرید. در macOS میتوانید از Homebrew هم استفاده کنید. در Windows پیشنهاد این مسیر آموزشی کار داخل WSL است.Bash برای این مخزن هر نسخه از 1.21 به بعد کافی است، چون خود Go نسخهٔ دقیق پروژه را دانلود میکند. دلیلش را در ادامه میبینید.
بررسی نصب
Bash دیدن محل پوشهها
Bash
$ go versiongo version go1.27.4 linux/amd64$ go env GOPATH GOMODCACHE GOCACHE/home/you/go/home/you/go/pkg/mod/home/you/.cache/go-buildهر پوشه چه کاری میکند
نکتهٔ مهم برای کسی که از Python میآید: در Go محیط مجازی وجود ندارد و لازم هم نیست. بستهها یک بار در GOMODCACHE ذخیره میشوند و هر پروژه در فایل go.mod خودش میگوید کدام نسخه را میخواهد. دو پروژه با دو نسخهٔ متفاوت از یک بسته هیچ تداخلی ندارند.
نسخهٔ Go هر پروژه در خود پروژه قفل میشود
فایل go.mod این مخزن را ببینید:
خط go حداقل نسخهٔ زبان را میگوید و خط toolchain نسخهٔ دقیق ابزار را. اگر Go نصبشدهٔ شما قدیمیتر باشد، دستور go نسخهٔ خواستهشده را خودش دانلود و همان را اجرا میکند. این رفتار را متغیر GOTOOLCHAIN کنترل میکند که پیشفرض آن auto است. نتیجه این است که همهٔ اعضای تیم و CI دقیقاً با یک نسخه کار میکنند، بدون ابزار جدایی مثل pyenv.
کد Go و معادل Python
سادهترین برنامه در دو زبان:
سه چیز در نسخهٔ Go اجباری است و در Python نیست:
- هر فایل با
packageشروع میشود. برنامهٔ اجرایی باید درpackage mainباشد. - هر چیزی که استفاده میکنید باید
importشده باشد و هر چیزی کهimportمیکنید باید استفاده شود. - نقطهٔ شروع برنامه تابع
mainاست. کد سطح بالای فایل، آنطور که در Python مینویسید، وجود ندارد.
اجرا:
$ cd code/go$ go run ./phase00/l01_installation/examples/helloسلام، دنیا!حالا یک مثال کمی واقعیتر که آرگومان خط فرمان میگیرد و اطلاعات محیط را چاپ میکند:
$ go run ./phase00/l01_installation/examples/greet گوفرسلام، گوفر!go1.27.4 on linux/amd64$ go build -o greet ./phase00/l01_installation/examples/greet$ ./greetسلام، دنیا!go1.27.4 on linux/amd64دستور go build یک فایل اجرایی به نام greet ساخت. این فایل را میتوانید روی هر سیستم Linux با همان معماری کپی و اجرا کنید، حتی اگر Go روی آن نصب نباشد.
مقایسهٔ کنار هم
زیر کاپوت
در Go دستور go build این کارها را میکند:
- هر package را جدا کامپایل میکند: تجزیهٔ کد، بررسی نوعها، بهینهسازی و تولید کد ماشین.
- نتیجهٔ هر package را در
GOCACHEنگه میدارد. اگر کد عوض نشده باشد، دفعهٔ بعد دوباره کامپایل نمیشود. - linker همهٔ packageها را با runtime خود Go در یک فایل میگذارد. runtime شامل زمانبند goroutineها و garbage collector است.
دستور go run همین کار را میکند، فایل اجرایی را در یک پوشهٔ موقت میسازد، اجرا میکند و بعد دور میاندازد.
چون runtime داخل فایل است، حتی برنامهٔ چاپ یک خط هم کوچک نیست. روی linux/amd64 با Go 1.27.4 فایل برنامهٔ hello حدود ۲٫۴ مگابایت شد و با حذف اطلاعات اشکالزدایی حدود ۱٫۵ مگابایت:
$ go build -o hello ./phase00/l01_installation/examples/hello$ ls -l hello-rwxr-xr-x 1 you you 2354953 hello$ go build -trimpath -ldflags="-s -w" -o hello ./phase00/l01_installation/examples/hello$ ls -l hello-rwxr-xr-x 1 you you 1507488 helloدر CPython مفسر کد منبع را به bytecode تبدیل میکند و یک حلقهٔ ارزیابی آن bytecode را دستور به دستور اجرا میکند. bytecode ماژولهایی که import میشوند در پوشهٔ __pycache__ ذخیره میشود، ولی برای اسکریپت اصلی ذخیره نمیشود. در هر حال مفسر باید هنگام اجرا حاضر باشد.
پیامد عملی: خطاهایی مثل نام اشتباه یک تابع یا ناسازگاری نوع در Go پیش از اجرا گرفته میشوند. در Python همان خطا تا وقتی آن خط اجرا نشود پنهان میماند، مگر اینکه mypy یا تست آن را پیدا کند.
اشتباههای رایج
نکتههای Senior
تمرینها
کد شروع همهٔ تمرینها در code/go/phase00/l01_installation/exercises/exercise.go و code/python/phase00/l01_installation/exercises/exercise.py است. همان فایلها را کامل کنید و تستها را اجرا کنید.
تمرین: سلام با نام دلخواه
تابعی بنویسید که یک نام بگیرد و متن خوشامد برگرداند. اگر نام خالی بود، بهجای آن واژهٔ «دنیا» را بگذارید. خروجی برای نام خالی باید دقیقاً سلام، دنیا! باشد.
کد شروع
تمرین: اطلاعات محیط اجرا
تابعی بنویسید که نسخهٔ زبان، سیستمعامل و معماری را در یک رشته برگرداند. در Go قالب خروجی go1.27.4 linux/amd64 است و مقدارها را از بستهٔ runtime بگیرید. در Python قالب Python 3.14.6 linux/x86_64 است و از platform و sys استفاده کنید.
کد شروع
تمرین: خواندن نسخه از go.mod
تابعی بنویسید که متن یک فایل go.mod را بگیرد و نسخهٔ toolchain آن را برگرداند. قاعدهها:
- اگر خط
toolchainوجود دارد، نسخهٔ آن بدون پیشوندgoبرگردد. - وگرنه نسخهٔ خط
goبرگردد. - اگر هیچکدام نبود، مقدار دوم بازگشتی
falseباشد. - فاصلههای اضافه و توضیح انتهای خط نباید نتیجه را خراب کنند.
این تمرین از چیزهایی استفاده میکند که هنوز درسشان نرسیده است: حلقه، switch و بستهٔ strings. با تجربهٔ Python میتوانید از روی مستندات go doc strings.Fields پیش بروید.
کد شروع
تمرین: تزریق نسخه هنگام build
در فایل تمرین متغیر version با مقدار dev تعریف شده است. دو تابع را کامل کنید: Version همان مقدار را برمیگرداند و FullVersion آن را با خروجی BuildInfo در قالب dev (go1.27.4 linux/amd64) ترکیب میکند.
سپس بدون تغییر کد، کاری کنید که Version مقدار 1.4.0 برگرداند. راهنما: پرچم -ldflags و گزینهٔ -X آن. در پایان توضیح دهید چرا این روش از نوشتن نسخه در یک فایل پیکربندی بهتر است.
کد شروع
آزمون
آزمون
۰ از ۷ پاسخ داده شده۱.دستور
go run .دقیقاً چه میکند؟۲.اگر بستهٔ
osراimportکنید ولی از آن استفاده نکنید چه میشود؟۳.خط
toolchain go1.27.4درgo.modچه نقشی دارد؟۴.چرا در Go به محیط مجازی نیاز نیست؟
۵.چرا فایل اجرایی یک برنامهٔ یکخطی حدود ۲ مگابایت است؟
۶.کدام دستور خروجی Windows را روی Linux میسازد؟
۷.متغیر
GOCACHEبه چه چیزی اشاره میکند؟
خلاصه و چکلیست
- Go کد را پیش از اجرا به کد ماشین کامپایل میکند و خروجی یک فایل اجرایی است که runtime را درون خود دارد.
- همهٔ ابزارها زیردستورهای
goهستند:go run،go build،go test،go fmtوgo vet. - محیط مجازی وجود ندارد؛
go.modهر پروژه نسخهها را مشخص میکند و cache مشترک است. - خط
toolchainنسخهٔ دقیق ابزار را برای همهٔ تیم یکسان میکند. importو متغیر بدون استفاده خطای کامپایل است.
پیش از رفتن به درس بعد مطمئن شوید:
go versionنسخه را چاپ میکند.- برنامهٔ
helloرا هم باgo runو هم باgo buildاجرا کردهاید. - میتوانید بگویید
GOROOT،GOMODCACHEوGOCACHEهر کدام چه چیزی نگه میدارند. - تستهای این درس با
make exercise PHASE=00 LESSON=01سبز است.
پیام commit پیشنهادی
این درس را تمام کردید؟
پیشرفت شما فقط در همین مرورگر ذخیره میشود.