Gopher Academy
3.33K subscribers
916 photos
40 videos
279 files
1.96K links
🕸 Gopher Academy

🔷interview golang
https://github.com/mrbardia72/Go-Interview-Questions-And-Answers

حمایت مالی:
https://www.coffeete.ir/mrbardia72

ادمین:
@mrbardia72
Download Telegram
در طراحی کامپایلرها، Static Single Assignment (SSA) یک فرم نمایش میانی (Intermediate Representation یا IR) است که در آن هر متغیر تنها یک‌بار تعریف می‌شود. این روش برای بهینه‌سازی کد و ساده‌سازی تحلیل‌هایی مثل زنجیره‌های استفاده-تعریف (use-define chains) استفاده می‌شود. کامپایلر گولنگ (مانند gc یا ابزارهای مرتبط با LLVM) ممکن است در مراحل بهینه‌سازی داخلی خود از مفاهیم مشابه SSA استفاده کند،

مثال ساده:
فرض کنید کدی مثل این دارید
func main() {
x := 1
x = x + 2
fmt.Println(x)
}

در فرم SSA، متغیر x به نسخه‌های مختلفی (مثل x1 و x2) تقسیم می‌شود تا هر تخصیص یکتا باشد:

x1 := 1
x2 := x1 + 2
fmt.Println(x2)


این نمایش به ابزارهای تحلیل کمک می‌کنه تا بتونن دقیق‌تر بررسی کنن که مقادیر متغیرها از کجا میان و کجا استفاده می‌شن.

🔴 این کار باعث می‌شه ردیابی جریان داده‌ها (مثل اینکه یک متغیر کجا تعریف و کجا استفاده شده) ساده‌تر بشه. این روش به‌خصوص برای ابزارهایی مثل بررسی باگ‌ها، بهینه‌سازی کد، یا تحلیل وابستگی‌ها خیلی مفیده.
2👍2
🎯 تفاوت بین Heap و Stack به زبان ساده:

Stack:
- چیست؟
حافظه‌ای با دسترسی سریع و مدیریت خودکار که برای ذخیره متغیرهای محلی و موقت (مثل متغیرهای داخل تابع) استفاده می‌شه.
- ویژگی‌ها:
- تخصیص و آزادسازی حافظه به صورت LIFO (Last In, First Out) انجام می‌شه.
- اندازه‌اش معمولاً محدود و ثابت است.
- سریع‌تره چون مدیریتش ساده‌ست.
- متغیرهای محلی (مثل int x = 5) و ارجاعات تابع در Stack ذخیره می‌شن.

Heap:
- چیست؟
حافظه‌ای پویا برای ذخیره داده‌هایی که عمر طولانی‌تری دارن یا اندازه‌شون در زمان اجرا مشخص می‌شه (مثل اشیاء یا آرایه‌های پویا).
- ویژگی‌ها:
- تخصیص و آزادسازی حافظه به صورت دستی یا توسط Garbage Collector (در گولنگ به صورت خودکار).
- کندتر از Stack چون مدیریتش پیچیده‌ست.
- برای داده‌های بزرگ یا اشتراک‌گذاری بین توابع استفاده می‌شه.

تفاوت کلیدی:
- سرعت: Stack سریع‌تره چون مدیریتش ساده‌ست.
- مدیریت: Stack خودکار مدیریت می‌شه، اما Heap نیاز به Garbage Collector داره (در گولنگ).
- عمر داده: Stack برای داده‌های موقت (محدوده تابع)، Heap برای داده‌های با عمر طولانی‌تر.
- اندازه: Stack محدودتره، Heap بزرگ‌تر و پویاست.

در گولنگ:
گولنگ با Escape Analysis تصمیم می‌گیره که یک متغیر در Stack یا Heap ذخیره بشه. مثلاً اگر متغیر از تابع خارج بشه (مثل برگرداندن اشاره‌گر)، به Heap می‌ره.
1👍1💯1🦄1
Forwarded from Gopher Job
😂😂👍🏻💯💯
👌1111👍1
🛠 ابزارها در حوزه Linters و تحلیل کد Go

1. Actionlint

* وظیفه: بررسی استاتیک فایل‌های workflow در GitHub Actions (.yml/.yaml در مسیر .github/workflows/)
* ویژگی‌ها:

* بررسی نحوی و semantic expressions (${{ }})
* اعتبارسنجی فراخوانی Actionها، ورودی/خروجی، نوع runners و امنیت اسکریپت‌ها
* استفاده از ShellCheck و Pyflakes برای lint کردن inline scripts
* CLI + کتابخانه Go برای استفاده در ابزارهای CI/CD ([megalinter.io][1])

---

2. Hadolint

* وظیفه: lint کردن Dockerfile
* ویژگی‌ها:

* نوشته شده با Haskell**؛ استفاده از AST برای تحلیل دستورات Docker
* ادغام با **ShellCheck
برای بررسی اسکریپت‌های bash داخل RUN
* امکان ignore قوانین، سفارشی‌سازی severity، trusted registries و خروجی‌های متنوع (json, sarif, checkstyle)
* قابلیت اجرا به صورت binary، container تصویر Docker و ادغام در CI یا IDE ([megalinter.io][2])

---

3. deadcode

* وظیفه: شناسایی کدهای بلا‌استفاده (dead code) در برنامه‌های Go
* ویژگی‌ها:

* استفاده از تحلیل Rapid Type Analysis (RTA) برای ساخت call graph از تابع‌های reachable از main
* شناسایی توابع و متدهایی که در جریان اجرا هرگز فراخوانی نمی‌شوند، حتی در ورودی‌های تست
* گزینه‌های -test, -filter, -generated برای کنترل نوع تحلیل و محدودسازی نتایج
* نصب از طریق go install ...@latest ([Google Groups][3], [Go][4], [Go Packages][5])

---

4. fieldalignment

* وظیفه: آنالیز alignment فیلدهای struct
* ویژگی‌ها:

* بررسی شکل ساختار struct برای بهبود چینش فیلدها و کاهش حافظه مصرف‌شده
* موجود در پکیج go/analysis و قابل اجرا به‌صورت standalone یا در قالب Pass در تحلیل‌های سفارشی
* نصب با go install golang.org/x/tools/go/analysis/passes/fieldalignment/cmd/fieldalignment@latest

---

5. Protolint

* وظیفه: lint (و در برخی موارد fix) فایل‌های .proto مطابق با استاندارد Google Protobuf
* ویژگی‌ها:

* اجرا بدون نیاز به compiler اصلی (protoc) و سبک اجرا
* تولید گزارش برای قوانین style مانند نام‌گذاری، indentation، order imports، documentation، comment برای RPC و پیام‌ها
* توانایی غیرفعال‌سازی قوانین در سطح فایل، استفاده از پلاگین برای قوانین سفارشی، و خروجی‌های متنوع (json, junit, sarif)


کدومش برای پروژه شما کاربردیه؟

* CI پروژه با workflows عالیه → Actionlint
* ساختن Docker image استاندارد/امن → Hadolint
* حذف کدهای غیرضروری پس refactor → deadcode
* بهینه‌سازی حافظه باینری در structها → fieldalignment
* بررسی فایل‌های protobuf و استانداردسازی API → Protolint
3👍1
Forwarded from Gopher Academy
🏆31👨‍💻1
🔐 مفهوم Mutex در Go

اsync.Mutex یک اصل اساسی برای کنترل دسترسی امن به منابع مشترک بین goroutineها است. این نوع قفل تضمین می‌کند که در هر لحظه تنها یک goroutine به بخش حیاتی از کد (critical section) دسترسی دارد

---

🧠 وضعیت‌های مختلف Mutex

می‌توان عملکرد آن را با وضعیت‌های زیر توضیح داد:
ا
ا* Unlocked (حالت اولیه): Mutex آزاد است و هر goroutine می‌تواند با فراخوانی Lock() آن را بگیرد.
ا* Locked: وقتی یک goroutine Lock() می‌زند، دیگران باید منتظر بمانند.
ا* Waiting: در صورت تلاش هم‌زمان چند goroutine برای گرفتن قفل، بقیه به صف انتظار اضافه می‌شوند.
ا* Starvation Mode: اگر یک goroutine بیش از \~۱ms نتواند قفل را بگیرد، سیستم وارد حالت گرسنگی (fair mode) شده و به ترتیب به goroutineهای قدیمی‌تر اجازه دسترسی می‌دهد ([CSDN Blog][3], [Zhihu Zhiwan][4]).

---

⚙️ عملکرد درونی Mutex

* از عملیات غیرقابل قطع (CAS) برای کنترل فیلد state استفاده می‌شود.
* در شرایط کم‌رقابت ابتدا به‌صورت spinning تلاش می‌کند تا حد ممکن بدون خوابیدن lock را بگیرد.
* در سطوح بالای رقابت، goroutineها به صف انتظار اضافه می‌شوند و بیدار می‌شوند وقتی قفل آزاد شد.
* حالت starvation زمانی فعال می‌شود که یک goroutine مدت طولانی در انتظار است تا از حالت FIFO استفاده شود

---

نکات کاربردی و بهترین شیوه‌ها

1. هیچ گاه Mutex را کپی نکنید؛ حتی تصادفاً**—مستقیماً باید از pointers استفاده شود
2. هیچ‌گاه موضعی در struct آن را جاسازی (embed) نکنید، چون باعث در دسترس‌پذیری ناخواسته متدهای Lock/Unlock می‌شود
3. از
defer m.Unlock() برای اطمینان از آزادسازی قفل حتی در صورت panic یا return زودهنگام استفاده کنید
4. بخش قفل‌شده باید حداقل زمان ممکن طول بکشد؛ انجام عملیات بلندمدت در آن ممکن است باعث کاهش concurrency و تأخیر جدی شود.

---

⚠️ مشکلات رایج و اشتباهات متداول

* **کپی ناخواسته Mutex: حذف ایمنی synchronization و موجب رفتار نامشخص.
ا* embedding Mutex: باعث انتشار متدهای داخلی قفل به بیرون struct می‌شود — روش اشتباهی است
ا* Double Unlock یا Unlock بدون Lock قبلی → panic.
* عدم رعایت defer → ممکن است در صورت خطا یا exit، قفل آزاد نشود و deadlock رخ دهد.
ا* Deadlock ناشی از تداخل دو یا چند goroutine با mutexهای متفاوت و انتظار متقابل بر مبنای نظم اشتباهی بین Lock()ها.
6👍1
مقاله‌ی «Top 6 Golang Logging Best Practices» در HackerNoon توسط Lane Wagner در سال ۲۰۲۲ منتشر شده و به بررسی نکاتی اساسی ولی کاربردی درباره‌ی لاگ‌نویسی در زبان Go پرداخته است. در ادامه، خلاصه‌ای مختصر

---

## نکات کلیدی مقاله

1. استفاده از `error` بجای رشته‌ها (strings)
از نوع استاندارد error برای نشان دادن خطاها استفاده کن تا از رفتارهای نادرست مانند نادیده‌گرفتن خطا یا پراکندگی سازوکار خطا جلوگیری شود.

2. Wrap کردن خطاها
بجای لاگ فقط پیام خطا، آن را wrap کن تا محل دقیق رخداد خطا (stack trace یا خط کد) حفظ شود و دیباگ آسان‌تر شود.

3. استفاده از `fmt.Errorf()` برای قالب‌بندی
fmt.Errorf() با قابلیت %w به تو اجازه می‌دهد خطاها را قالب‌بندی و wrap کنی:

   return fmt.Errorf("failed to open file: %w", err)


4. قالب‌دهی structها (Format Structs)
وقتی structها در لاگ‌ها استفاده می‌شن، آن‌ها را قالب‌مند کن تا خواناتر و مفیدتر باشند؛ مثلاً با فرمت:

   fmt.Printf("%+v", myStruct)


5. استفاده از نسخه variadic توابع مانند `fmt.Println()`
ورژن variadic بهت اجازه می‌دهد مولفه‌های مختلف را بدون تلاش برای concatenation دستی به هم بچسبونی. خوانا و منعطف‌تره.

6. استفاده از بسته‌ی استاندارد `log`
برای شروع خوبه، خصوصاً برای پروژه‌های ساده یا کوچک. log پایدار و سبک هست و کافی برای کاربردهای ابتدایی است.

---

جمع‌بندی سریع

اینها اصولی هستند که در بسیاری از آموزش‌ها و بحث‌های Go توصیه می‌شن: استفاده از سیستم خطای داخلی، پیروی از استانداردها در wrap خطا، قالب‌دهی مناسب، و استفاده از امکانات داخلی زبان قبل از رفتن به راه‌حل‌های پیچیده‌تر.

---

توصیه‌های عملی

* لاگ‌نویسی رو با استفاده از خطاهای داخلی Go شروع کن.
* ورودی‌ها رو wrap کن؛ structها رو مرتب قالب بده.
* برای لاگ‌های پیشرفته‌تر، از structured logging استفاده کن (مثل Zap یا Zerolog).
* همیشه context مهم رو مثل request ID در لاگ‌ها نگه‌دار.
* حجم لاگ رو کنترل کن: نه خیلی زیاد باشه که کارایی رو پایین بیاره، نه خیلی کم که مفید نباشه.
🤝4👍1
📌 چرا به جای sync.Mutex از sync/atomic استفاده کنیم؟

سریع‌تره چون نیازی به قفل کردن نداره.

اما فقط برای عملیات ساده مثل افزایش/خواندن مقدار مناسبه.

برای عملیات پیچیده‌تر، هنوز باید از sync.Mutex یا sync.RWMutex استفاده کنی.
2
2
Forwarded from DevOps Labdon
یکی از فوق العاده ترین ابزارهای مدیریت کلاستر kubernetes که هرروز باهاش کار میکنم و واقعا لذت میبرم k9s هست:
https://github.com/derailed/k9s

<Mohsen Khodabakhshi/>
6
💐امکانات جدید در GoLand 2025.2

۱. تحلیل جریان داده برای جلوگیری از nil dereference

اGoLand اکنون از تحلیل بین‌تابعی (interprocedural) استفاده می‌کند تا جریان‌ داده‌های nil را در حلقه‌های فراخوانی تابع، فایل‌ها و بسته‌ها دنبال کند. در نتیجه، هشدارهایی برای استفاده‌های ناایمن از اشاره‌گرها (dereference) به شکل مستقیم در ادیتور نمایش داده می‌شود. علاوه بر این، تب جدیدی به نام Data Flow Analysis در پنجره Problems اضافه شده که مسیر دقیق جریان nil را نشان می‌دهد.


۲. صفحه خوش‌آمدگویی غیرمسدودکننده (Non‑blocking Welcome screen)

صفحه خوش‌آمدگویی (Welcome Screen) حالا به صورت تب (tab) در IDE باز می‌شود، بدون آنکه اجرای محیط توسعه را متوقف کند. این امکان را دارید که بدون باز کردن پروژه به ترمینال، ابزار HTTP، Docker، Kubernetes یا پایگاه‌داده دسترسی داشته باشید و حتی فایل‌های مستقل را ویرایش کنید.


۳. کشف هوشمندانه‌تر endpoint‌ها و تولید درخواست (Request) خودکار

ابزار Endpoints بهبود یافته تا الگوهای مدرن ServeMux را بهتر بشناسد؛ از جمله مسیرهای wildcard یا آن‌هایی که با HTTP method همراه هستند، مانند GET /task/{id}/.
علاوه بر این، متد HTTP در کنار هر endpoint نمایش داده شده، autocomplete برای ساخت آسان‌تر request فعال شده و پشتیبانی از فریم‌ورک‌هایی مانند Chi, Gin, Gorilla نیز بهبود یافته است.


۴. اJunie؛ عامل هوشمند داخل IDE

عامل هوشمند Junie حالا سریع‌تر شده (حدود ۳۰٪ افزایش سرعت)، از پروتکل MCP (Model Context Protocol) پشتیبانی می‌کند و امکان کار در محیط Remote Development را فراهم می‌آورد—همه این‌ها در دل IDE برای تسهیل کارهای حرفه‌ای‌تر.


۵. ارتقا در پشتیبانی از golangci-lint نسخه ۲

ادغام با golangci-lint بهبود یافته، به طوری که نسخه‌ی جدید آن (v2) در تحلیل بلادرنگ (real-time) بهتر و مطمئن‌تر عملکرد دارد.
---
خلاصه کاربردی

ویژگی جدید کاربرد

تحلیل ‌Nil با DFA جلوگیری از خطاهای اشاره‌گری قبل از runtime
صفحه خوش‌آمدگویی غیرمسدودکننده دسترسی سریع‌تر به ابزارها بدون باز کردن پروژه
کشف و Request خودکار endpoint‌ها تسهیل تعامل با HTTP در توسعه وب
اJunie با MCP و پشتیبانی Remote افزایش سرعت و قابلیت هوشمند برای توسعه حرفه‌ای
ارتقاء golangci‑lint integration تحلیل کد دقیق‌تر و قابل‌اعتمادتر در زمان توسعه

---

در مجموع، نسخه 2025.2 تمرکزش را روی بهبود تجربه توسعه‌دهنده معطوف کرده—از تشخیص هوشمند خطا تا دسترسی سریع به ابزارها و هوشمندسازی کمک‌ها در IDE.
🔥51👍1
«به جای اینکه توی benchmark از for i := 0; i < b.N; i++ { ... } استفاده کنی، می‌تونی از متد جدیدتر b.Loop() استفاده کنی.»

توضیح

در تست‌های بنچمارک گولنگ (یعنی تابع‌هایی که با func BenchmarkXxx(b *testing.B) نوشته می‌شن)، معمولاً برای اجرای کد به تعداد کافی و گرفتن میانگین زمان اجرا، از این الگو استفاده میشه:

for i := 0; i < b.N; i++ {
// کدی که باید بنچمارک بشه
}


ولی از نسخه‌های جدیدتر Go، متد [`b.Loop()`](https://pkg.go.dev/testing#B.Loop) اضافه شده که همین کار رو به شکل مدرن و کمی بهینه‌تر انجام میده و خوانایی رو هم بهتر می‌کنه:

b.Loop(func() {
// کدی که باید بنچمارک بشه
})


فرق اصلی

* کد کوتاه‌تر و خواناتر
* جلوگیری از اشتباهات احتمالی در حلقه شمارشی
* خود Go در آینده ممکنه بهینه‌سازی‌های بیشتری روی b.Loop انجام بده

مثال تبدیل

قدیم:

func BenchmarkSomething(b *testing.B) {
for i := 0; i < b.N; i++ {
doWork()
}
}


جدید:

func BenchmarkSomething(b *testing.B) {
b.Loop(func() {
doWork()
})
}


پس پیغام `b.N can be modernized using b.Loop()` یعنی «لطفاً حلقه for رو به b.Loop تغییر بده».
🍓4👨‍💻1
دیدگاه جامعه درباره استفاده از Enum در Go

اهمیت خاص گذاشتن روی مقدار Invalid در صفر:

“New go devs from Java tend to forget that the enum doesn’t default to null… defining 0 as unknown saves a lot of confusing bugs!”


هشدار نسبت به وابستگی زیاد به iota وقتی این مقادیر در دیتابیس ذخیره می‌شن:

“Reordering/removing cases also doesn't cause any big problem… unless you are using the number representation of enums in the database.”


برخی هم در بحث‌های Reddit اشاره کرده‌اند که enumهای واقعی مثل Rust’s sum types در Go وجود ندارند و هرچقدر هم شبیه‌سازی شوند، محدودیت‌هایی دارند.
👌7
Forwarded from AI Labdon
تاج‌گذاری OpenAi در میدان شطرنج هوش مصنوعی ؛ ChatGPT گراک رو به زمین زد!

▪️در اولین دوره مسابقات شطرنج هوش‌ مصنوعی در Kaggle Game Arena، مدل o3 از OpenAI با یک نمای قاطع 4 بر 0 مقابل Grok 4 (xAI) پیروز شد.

▪️مدل o3 با دقت 90.8% و بازی‌های حساب‌شده، حریف رو به اشتباهات سخت کشوند؛ در حالی که Grok 4 با دقت 80.2% نتونست جلوی سقوط مهره‌ها رو بگیره.

▪️رده‌بندی نهایی :

🥇 OpenAI - o3 (قهرمان)
🥈 xAI - Grok 4 (نایب‌قهرمان)
🥉 Gemini 2.5 Pro (مقام سوم)
🏆31
🆗 چیستی SBOM و اهمیتش؟

ا* SBOM یا Software Bill of Materials، لیستی ساختاریافته از تمام اجزای تشکیل‌دهنده نرم‌افزار مثل پکیج‌ها، ماژول‌ها و کتابخانه‌هاست. این لیست کمک می‌کنه تیم‌ها بر زنجیره تأمین نرم‌افزاری، وابستگی‌ها و ریسک‌های امنیتی تسلط بهتری داشته باشن
* در پروژه‌های Go، فایل go.mod فقط وابستگی‌های مستقیم رو فهرست می‌کنه، اما SBOM برای پوشش‌دهی وابستگی‌های غیرمستقیم (transitive) و تولید خروجی در قالب‌های استاندارد بسیار کاربردی‌تره

---

مزایای SBOM

| مزیت | توضیح |
| --------------- | ------------------------------------------------------ |
| امنیت | شناسایی سریع آسیب‌پذیری‌های وابستگی‌ها |
| تطابق با مجوزها | بررسی مجوزهای وابستگی‌ها قبل از انتشار |
| استانداردسازی | استفاده از فرمت‌های مشترک و قابل تحلیل |
| الزامات قانونی | کاربرد در پروژه‌هایی با نیازهای compliance مثل FedRAMP |


---

نحوه‌ی تولید SBOM در پروژه‌های Go

1. نصب ابزار CycloneDX برای Go:


   go install github.com/CycloneDX/cyclonedx-go@latest


2. تولید SBOM با فرمت JSON:


   cyclonedx-go mod -json -output sbom.json


3. تحلیل SBOM با ابزارهایی مثل Grype:


   grype sbom.json


4. بررسی تطابق مجوزها:


   cyclonedx-go mod -licenses -json -output licenses.json


* برای پروژه‌هایی که از Go Workspace استفاده می‌کنن، باید به‌طور موقت آن را غیرفعال کرد (مثلاً با GO111MODULE=off) تا ابزار بتواند SBOM را به درستی تولید کند

---

جمع‌بندی کوتاه

*ا SBOM یک نقشهٔ دقیق از تمام اجزای نرم‌افزار شماست—وقت نگرانی دربارهٔ نسخه‌ها، آسیب‌پذیری‌ها یا مجوزهای حقوقی شون داشته باشی.
* ابزار CycloneDX for Go ساده‌ترین راه برای تولید SBOM در پروژه‌های Go است.
* پس از تولید، ابزارهایی مثل Grype و CycloneDX خود ابزار خوبی برای تحلیل و بررسی و آسیب‌پذیری یا مجوزها فراهم می‌کنن.
👌4👍1🔥1
یه محیط خفن گرافیکی جذاب برای یادگیری الگوهای Concurrency

Go Concurrency Explorer

https://www.concurrency.rocks
1👌1🍾1
Forwarded from Linux Labdon
لینوس توروالدز: کد مهندس گوگل «آشغال محض» بود!

▪️همه فکر می‌کنن مهندسای گوگل در قله کیفیت هستن، اما خالق لینوکس یه شوک اساسی داد! لینوس توروالدز بدون هیچ تعارف، کد یکی از برنامه‌نویسای گوگل رو «به درد نخور» خطاب کرد و اون رو با خاک یکسان کرد.

▪️ماجرا از یه Pull Request مربوط به پشتیبانی RISC-V در لینوکس 6.17 شروع شد. پالمر دابلت از تیم اندروید، تغییرات رو فرستاد، ولی:

1. کیفیت کدنویسی افتضاح!

2. ارسال دیرهنگام در «پنجره ادغام»!
4🔥1