Gopher Academy
3.87K subscribers
929 photos
41 videos
280 files
2.11K links
🕸 Gopher Academy

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

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

ادمین:
@mrbardia72
Download Telegram
Gopher Academy
📌 Memory Allocation in Go این پست اپدیت می‌شود 🔹 در این پست به بررسی جزئیات مدیریت حافظه در زبان Go می‌پردازیم. درک درست از ساختار حافظه به شما کمک می‌کند عملکرد برنامه‌هایتان را بهتر بهینه کنید و رفتار Garbage Collector را بهتر بفهمید. 🔵 Introduction…
🧠د Heap Bits در Go — هوشمندی در مدیریت حافظه

در Go، اشیاء کوچکتر از ۵۱۲ بایت درون span‌هایی نگهداری می‌شن که خودشون چندین شیء هم‌اندازه دارن.
اما چطور Garbage Collector می‌فهمه کدوم بخش از این اشیاء شامل pointer هست؟
پاسخ: با Heap Bitmap

🔹 هر span یک نقشه‌ی بیتی (bitmap) در انتهای خودش داره.
🔹 هر بیت مربوط به یک "word" از حافظه (معمولاً ۸ بایت) هست:

1️⃣ = شامل pointer

0️⃣ = داده‌ی عادی (non-pointer)

به این ترتیب، GC فقط بخش‌هایی رو اسکن می‌کنه که واقعاً pointer دارن — سریع‌تر و بهینه‌تر از اینکه کل حافظه بررسی بشه.

📦 هر span علاوه‌بر فضای مورد نیاز برای اشیاء، مقداری فضا برای این bitmap کنار می‌گذاره.

👑 @gopher_academy
1👍1
Gopher Academy
📌 Memory Allocation in Go این پست اپدیت می‌شود 🔹 در این پست به بررسی جزئیات مدیریت حافظه در زبان Go می‌پردازیم. درک درست از ساختار حافظه به شما کمک می‌کند عملکرد برنامه‌هایتان را بهتر بهینه کنید و رفتار Garbage Collector را بهتر بفهمید. 🔵 Introduction…
برای اشیایی که اندازه‌شان بیشتر از ۵۱۲ بایت باشد، استفاده از یک بیت‌مپ بزرگ برای مدیریت حافظه کارآمد نیست. به جای آن، هر شیء با یک هدر ۸ بایت به نام "malloc header" همراه می‌شود. این هدر شامل یک اشاره‌گر به اطلاعات نوع شیء (type information) است.
این اطلاعات نوع شامل یک فیلد به نام "GCData" است که چیدمان اشاره‌گرها (pointer layout) در نوع شیء را کدگذاری می‌کند. جمع‌آوری زباله (garbage collector) از این داده‌ها استفاده می‌کند تا به طور دقیق و کارآمد فقط فیلدهایی که حاوی اشاره‌گرها هستند را هنگام پیمایش گراف اشیاء پیدا کند.
به زبان ساده، این روش به جمع‌آوری زباله کمک می‌کند تا بدون نیاز به بررسی کل حافظه، فقط بخش‌های مهم را که به اشیاء دیگر اشاره دارند، شناسایی و مدیریت کند.

👑 @gopher_academy
👍1🤝1
Gopher Academy
🔵 Introduction
🔴 https://t.me/gopher_academy/4231

🔵 Go’s View of Virtual Memory
🔴 https://t.me/gopher_academy/4232

🔵 Arena and Page
🔴 https://t.me/gopher_academy/4233

🔵 Span and Size Class
🔴https://t.me/gopher_academy/4260

🟡Two spans with different size classes
🟢https://t.me/gopher_academy/4261

🟡Tail waste in span
🟢https://t.me/gopher_academy/4262

🟡User objects and size class objects
🟢https://t.me/gopher_academy/4263


🔵Span Class
🔴 https://t.me/gopher_academy/4283

🔵Span Set
🔴https://t.me/gopher_academy/4284

🔵 Heap Bits and Malloc Header
🔴https://t.me/gopher_academy/4285

🟡Heap bits in a span
🟢https://t.me/gopher_academy/4286

🟡Malloc header in objects
🟢https://t.me/gopher_academy/4287
♥️جزییات فنی این بخش از مقالات رو می تونید توی لینک زیر بخونید

- https://github.com/golang/go/blob/go1.24.0/src/runtime/runtime2.go#L529-L529
🎯 کد تنظیمات اولیه runtime در Go - بخش اصلی اجرا!

- https://github.com/golang/go/blob/go1.24.0/src/runtime/proc.go#L117-L117
🚀 مدیریت فرآیندها (goroutines) در runtime Go.

- https://man7.org/linux/man-pages/man2/mmap.2.html
📚 مستندات mmap لینوکس - تخصیص حافظه به فرآیندها.

- https://github.com/golang/go/blob/go1.24.0/src/runtime/mheap.go#L245-L311
🗂 مدیریت هیپ در Go - تخصیص و آزادسازی صفحات حافظه.

- https://github.com/golang/go/blob/go1.24.0/src/runtime/mheap.go#L402-L496
🔧 مدیریت پیشرفته هیپ - ردیابی و تخصیص حافظه.

- https://github.com/golang/go/blob/go1.24.0/src/runtime/sizeclasses.go#L6
📏 تعریف کلاس‌های اندازه اولیه برای حافظه کارآمد.

- https://github.com/golang/go/blob/go1.24.0/src/runtime/sizeclasses.go#L61
🧮 محاسبات دقیق‌تر برای کلاس‌های اندازه حافظه.

- https://github.com/golang/go/blob/go1.24.0/src/runtime/sizeclasses.go#L44
⚙️ تنظیمات اضافی برای دسته‌بندی اندازه‌ها.

- https://github.com/golang/go/blob/go1.24.0/src/runtime/sizeclasses.go
📂 فایل کامل کلاس‌های اندازه حافظه در Go.

- https://github.com/golang/go/blob/go1.24.0/src/runtime/mheap.go#L556-L562
♻️ کد آزادسازی صفحات حافظه در هیپ.

- https://github.com/golang/go/blob/go1.24.0/src/runtime/mspanset.go#L14-L52
🌐 مدیریت مجموعه اسپن‌ها برای تخصیص حافظه.

- https://github.com/golang/go/blob/go1.24.0/src/runtime/mbitmap.go#L549-L582
🖼 مدیریت بیت‌مپ برای ردیابی حافظه.

- https://github.com/golang/go/blob/go1.24.0/src/runtime/malloc.go#L1470-L1470
💾 بخشی از تابع malloc برای تخصیص حافظه.

- https://github.com/golang/go/blob/go1.24.0/src/internal/abi/type.go#L31-L42
📋 تعریف ساختار نوع و متادیتای ABI در Go.



👑 @gopher_academy
3🍾1
🔵 عنوان مقاله
The new() Function Will Take an Expression in Go 1.26

🟢 خلاصه مقاله:
در Go 1.26 یک بهبود کوچک اما کاربردی می‌آید: تابع new() می‌تواند یک عبارت بگیرد، نه فقط یک نوع؛ Chris Siebenmann توضیح می‌دهد که این تغییر برخی الگوهای تخصیص و مقداردهی را ساده‌تر و خواناتر می‌کند. Tim Little با استفاده از raylib-go یک شبیه‌سازی آب بلادرنگ در Go می‌سازد و نشان می‌دهد چگونه می‌توان با ترکیب کارایی Go و سادگی raylib، رندر و فیزیک ساده را پیاده‌سازی کرد. Vladimir Makarov به تخصیص ثبات در کامپایلر Go می‌پردازد و تأثیر آن بر کارایی، استراتژی‌ها و ملاحظات بخش SSA را شرح می‌دهد. در نهایت، Ted Unangst یادآوری می‌کند که «دم» برش‌ها در Go بی‌نهایت رشد نمی‌کند و باید به ظرفیت، بازبرش و رفتار append توجه کرد تا از خطاها و افت کارایی جلوگیری شود.

#Go #Golang #Go126 #Compiler #RegisterAllocation #raylib #GameDev #Slices

🟣لینک مقاله:
https://golangweekly.com/link/175062/web


👑 @gopher_academy
2
Gopher Academy
🔵 عنوان مقاله The new() Function Will Take an Expression in Go 1.26 🟢 خلاصه مقاله: در Go 1.26 یک بهبود کوچک اما کاربردی می‌آید: تابع new() می‌تواند یک عبارت بگیرد، نه فقط یک نوع؛ Chris Siebenmann توضیح می‌دهد که این تغییر برخی الگوهای تخصیص و مقداردهی…
مثال از مقاله
یکی از مثال‌های مقاله مربوط به ساخت یک struct به نام Person است:

type Person struct {
Name string json:"name"
Age *int json:"age" // سن اگر مشخص باشد؛ در غیر این صورت nil
}

func newPerson(name string, age int) *Person {
return &Person{
Name: name,
Age: new(age), // ایجاد اشاره‌گر به کپی مقدار age
}
}

در اینجا، new(age) یک اشاره‌گر به کپی مقدار age می‌سازد. این کار قبلاً با &age ممکن بود، اما استفاده از new(age) می‌تواند در مواردی مثل بهینه‌سازی‌های کامپایلر (مانند آنالیز فرار یا escape analysis) مفید باشد، چون متغیر ورودی age ممکن است روی پشته (stack) باقی بماند و نیازی به تخصیص در هیپ (heap) نداشته باشد.

نکته در مورد ثابت‌ها (Constants)
یک نکته که در مقاله ذکر شده، این است که وقتی از new() با یک ثابت عددی (مثل 10) استفاده می‌کنید، نوع پیش‌فرض آن *int است، که ممکن است در برخی موارد باعث خطای نوع (type mismatch) شود. برای مثال:

var ui uint
var uip *uint

ui = 10 // درست است، چون 10 به طور خودکار به uint تبدیل می‌شود
uip = new(10) // خطا: نوع *int نمی‌تواند به *uint اختصاص یابد

برای رفع این مشکل، باید نوع ثابت را صراحتاً مشخص کنید:
uip = new(uint(10)) // درست است

چرا این تغییر مفید است؟
- سادگی کد: حذف نیاز به متغیرهای موقت باعث کوتاه‌تر و خواناتر شدن کد می‌شود.
- بهینه‌سازی: کامپایلر Go ممکن است بتواند کدهای نوشته‌شده با new(expr) را بهتر بهینه کند.
- یکنواختی: این تغییر باعث می‌شود که کار با انواع ساده و پیچیده در Go یکسان‌تر شود.
- محبوبیت: به نظر می‌رسد که معادل‌های این قابلیت (مثل تابع ref()) در جامعه Go رایج بوده و این ویژگی جدید پاسخ به نیاز واقعی توسعه‌دهندگان است.

مثال تکمیلی
فرض کنید می‌خواهید یک اشاره‌گر به یک مقدار محاسبه‌شده بسازید:

func calculateValue(x, y int) *int {
return new(x + y) // اشاره‌گری به نتیجه x + y
}

func main() {
p := calculateValue(5, 3) // p اشاره‌گری به مقدار 8 است
fmt.Println(*p) // خروجی: 8
}

این کد بدون نیاز به متغیر موقت، یک اشاره‌گر به نتیجه x + y می‌سازد.

نتیجه‌گیری
تغییر در تابع new() در Go 1.26 یک بهبود کوچک اما کاربردی است که کد را ساده‌تر و انعطاف‌پذیرتر می‌کند. این قابلیت به توسعه‌دهندگان اجازه می‌دهد تا بدون متغیرهای موقت، اشاره‌گرهایی به مقادیر محاسبه‌شده یا کپی‌های مقادیر دیگر بسازند، و در عین حال ممکن است به بهینه‌سازی‌های کامپایلر کمک کند.
👍2
🔵 عنوان مقاله
Building a Coding Agent in Go from Scratch

🟢 خلاصه مقاله:
این مجموعه سه مطلب عملی برای توسعه‌دهندگان Go را کنار هم می‌گذارد: ساخت یک coding agent از صفر در Go، استفاده از Timing Wheels برای انقضای کارآمد ۱۰ میلیون کلید بدون اسکن‌های O(n)، و مروری دقیق بر sync شامل Mutex، RWMutex، WaitGroup، Once، Cond و Pool. بخش agent بر معماری ماژولار، هماهنگی goroutine و channel، sandbox امن و حلقه بازخورد برای اجرای کد و بهبود تدریجی تأکید دارد. نوشته Bill Kennedy نشان می‌دهد چگونه با سطل‌بندی زمان‌سنج‌ها و حرکت چرخ، سربار و نوسان تأخیر کاهش می‌یابد و حتی در مقیاس بزرگ پایدار می‌ماند. در نهایت، مرور sync توصیه‌های عملی برای انتخاب درست بین primitives و channel، کاهش contention، و ارزیابی با benchmark، pprof و race detector ارائه می‌کند تا سامانه‌های Go هم هوشمند و هم سریع باشند.

#Go #Golang #Concurrency #TimingWheels #sync #SystemsProgramming #GoInternals #Performance

🟣لینک مقاله:
https://golangweekly.com/link/175365/web


👑 @gopher_academy
3👍1
🔵 عنوان مقاله
How to Reproduce and Fix an I/O Data Race with Go and DTrace

🟢 خلاصه مقاله:
در این مقاله نویسنده با یک باگ مبهم روبه‌رو می‌شود که فقط در CI رخ می‌دهد: یک data race در سطح I/O فایل‌ها که باعث شکست گهگاه تست‌ها می‌شود. چون این رقابت در مرز فایل‌سیستم رخ می‌دهد و نه در حافظه مشترک، ابزار race detector در Go آن را تشخیص نمی‌دهد. برای بازتولید محلی، نویسنده شرایط شبیه CI را ایجاد می‌کند: اجرای تکراری تست‌ها، افزایش همزمانی، و ایجاد تنوع زمانی تا ترتیب‌های نادری که خطا را می‌سازند آشکار شوند. با استفاده از DTrace و رصد فراخوانی‌های سیستمی مانند open، write، fsync و rename، الگوی واقعی آشکار می‌شود: خواندن فایل همزمان با نوشتن/حذف جزئی یا قبل از تحویل اتمی محتوا.

راهکار با اتمی‌سازی و هماهنگ‌سازی است: نوشتن در فایل موقت و سپس os.Rename برای تحویل اتمی، افزودن fsync در نقاط لازم، و در صورت نیاز قفل/کانال برای سریال‌سازی دسترسی به مسیرهای مشترک. در تست‌ها نیز از t.TempDir() برای جداسازی حالت، پرهیز از تکیه بر mtime، و اتکا به سیگنال‌های قطعی به‌جای تأخیرهای زمانی استفاده می‌شود. نتیجه، حذف flaky بودن در CI و همگرایی رفتار محلی و CI است؛ و درس اصلی اینکه برای رقابت‌های I/O باید به ابزارهای ردیابی سطح سیستم تکیه کرد و پروتکل I/O را صریح و اتمی طراحی نمود.

#Go #DTrace #Concurrency #CI #Filesystem #Testing #Debugging #RaceCondition

🟣لینک مقاله:
https://golangweekly.com/link/175360/web


👑 @gopher_academy
🔵 عنوان مقاله
How Cloudflare Found a Bug in Go's arm64 Compiler

🟢 خلاصه مقاله:
Cloudflare در مقیاسی بسیار بزرگ از Go روی زیرساخت‌های متنوع، به‌ویژه arm64، استفاده می‌کند؛ جایی که خطاهای نادر هم به‌دفعات رخ می‌دهند. آن‌ها با مجموعه‌ای از اختلال‌های پراکنده که فقط در بیلدهای arm64 دیده می‌شد مواجه شدند و با مقایسه میان معماری‌ها، کاناری‌کردن، و ساخت یک نمونه حداقلی، سرنخ‌ها را از منطق برنامه به سمت ابزار ساخت هدایت کردند. ریشه مشکل، یک خطای تولید کد در بخش arm64 کامپایلر Go بود که در شرایط خاص به بدترجمه‌سازی منجر می‌شد. تیم Cloudflare با همکاری تیم Go، مشکل را گزارش، بازتولید و برطرف کرد و پس از انتشار پچ، آن را به‌صورت مرحله‌ای در کل ناوگان اعمال نمود. نتیجه این تجربه: آزمون میان‌معماری، کاناری‌کردن ارتقاهای ابزار، و تقویت مشاهده‌پذیری برای مقابله با خطاهای کم‌شیوع اما پرهزینه در مقیاس بالا حیاتی است.

#Cloudflare #Go #arm64 #Compiler #Bug #ProductionScale #Reliability #OpenSource

🟣لینک مقاله:
https://golangweekly.com/link/175353/web


👑 @gopher_academy
1
Forwarded from Bardia & Erfan
پاول دوروف: آزادی اینترنت در حال نابودیه; ۴۱ سالگی رو جشن نمیگیرم

پاول دوروف در تولد ۴۱ سالگی‌اش نوشت:

«دیگه حس جشن ندارم؛ چون نسل ما داره اینترنت آزادی رو از دست می‌ده که پدران‌مون ساختن.

کشورهایی که روزی آزاد بودن، دارن به سمت کنترل کامل پیش می‌رن — از شناسه دیجیتال در بریتانیا تا اسکن پیام‌های خصوصی در اتحادیه اروپا.

در آلمان منتقدان دولت تحت پیگردن، در بریتانیا مردم برای توییت‌هاشون زندانی می‌شن و در فرانسه از مدافعان آزادی بازجویی می‌شه.

ما فریب خوردیم تا باور کنیم باید سنت، حریم خصوصی و آزادی بیان رو قربانی کنیم.

من جشن نمی‌گیرم... چون زمان ما برای نجات آزادی تموم می‌شه.»
👍2
Forwarded from AI Labdon
اگه به پروژه‌های اوپن‌سورس و ساختار و معماری‌شون علاقه‌مندین سایت DeepWiki رو داشته باشین

این سایت با هوش‌مصنوعی جزییات پروژه‌های اوپن‌سورس رو در اختیارتون میذاره

هر پروژه که روی گیتهاب هست رو کافیه به جای دامنه github.com بیاین deepwiki.com قرار بدین

مثلا فریمورک لاراول:
https://deepwiki.com/laravel/laravel

<Λmir/>
🔵 عنوان مقاله
be experimenting with

🟢 خلاصه مقاله:
از کتابخانه‌های زیادی که می‌خواهند به مخاطبان بیشتری برسند، در حال حاضر نسخه‌های JavaScript ارائه می‌شود تا هم در مرورگر و هم در محیط‌های Node.js، Deno و Bun در دسترس باشند. مزیت اصلی، دسترسی گسترده، توزیع ساده از طریق npm و تجربه کاربری یکپارچه بین فرانت‌اند و بک‌اند است.

دو مسیر رایج وجود دارد: بازنویسی بومی با TypeScript برای ارائه APIهای استاندارد، تایپ‌های دقیق و قابلیت tree-shaking؛ یا پورت از زبان‌های سطح پایین به WebAssembly برای حفظ کارایی و استفاده مجدد از کد موجود. ابزارهایی مانند Emscripten، wasm-bindgen و ابزارهای Go این کار را تسهیل می‌کنند و با ارائه TypeScript declarations سطح استفاده‌پسند ایجاد می‌شود.

چالش‌ها شامل انتخاب بین ESM و CJS، بهینه‌سازی اندازه باندل و دارایی‌های WASM، محدودیت‌های مرورگر (فایل‌سیستم و سوکت خام)، تفاوت‌های اجرا در Node.js/Deno/Bun، و مدیریت کارایی و زمان راه‌اندازی است. استفاده از Web Workers، بارگذاری تدریجی، بنچمارک‌گیری در محیط‌های مختلف و مستندسازی دقیق کمک‌کننده است. در حوزه امنیت نیز باید مراقب زنجیره تأمین، نسخه‌بندی SemVer، تست و انتشار مرحله‌ای بود.

نمونه‌های موفق شامل OpenCV.js، نسخه WASM از SQLite، TensorFlow.js، ONNX Runtime Web و Pyodide است که نشان می‌دهند با طراحی API مناسب و ابزار درست، پورت‌های جدی عملی است. قاعده تصمیم‌گیری: اگر کتابخانه سنگین و بهینه است، WASM انتخاب خوبی است؛ اگر هدف تجربه توسعه‌دهنده در اکوسیستم JavaScript است، بازنویسی با TypeScript بهتر است؛ و برای قابلیت‌های سخت‌افزاری/سیستمی، رویکرد هیبریدی یا سمت سرور منطقی است. با پیشرفت WebAssembly/WASI، WebGPU و پلتفرم‌های edge مانند Cloudflare Workers و Vercel Edge، زمان مناسبی برای آزمایش و تکرار است.

#JavaScript #WebAssembly #TypeScript #NodeJS #Deno #npm #OpenSource

🟣لینک مقاله:
https://golangweekly.com/link/175359/web


👑 @gopher_academy
🔵 عنوان مقاله
PG Back Web 0.5: A Postgres Backup System with Web Interface

🟢 خلاصه مقاله:
** PG Back Web 0.5 یک ابزار مبتنی بر Go برای مدیریت پشتیبان‌گیری‌های Postgres از طریق یک رابط وب ساده و کاربرپسند است. این برنامه امکان زمان‌بندی پشتیبان‌ها، پایش وضعیت و مشاهده تاریخچه را فراهم می‌کند و با webhooks می‌تواند اعلان‌ها را به سامانه‌های بیرونی ارسال کند. استقرار آن به‌صورت Docker image بسیار ساده است و در نسخه 0.5 پشتیبانی از Postgres 18 نیز اضافه شده تا با آخرین نسخه Postgres سازگار باشد.

#Postgres #Backup #Go #Docker #Database #DevOps #Webhooks #Monitoring

🟣لینک مقاله:
https://golangweekly.com/link/175372/web


👑 @gopher_academy
1
🔵 عنوان مقاله
yzma: Perform Local Inference with VLMs and LLMs

🟢 خلاصه مقاله:
yzma راهی سبک برای اجرای محلی VLMs و LLMs درون برنامه‌های Go است. این ابزار با استفاده از purego و ffi مستقیماً به llama متصل می‌شود و سربار اضافی را کاهش می‌دهد، در نتیجه تأخیر پایین‌تر، کنترل بهتر و اجرای آفلاین فراهم می‌شود. تمرکز yzma بر ادغام ساده در سرویس‌ها و ابزارهای Go است تا بتوان هم پردازش متن و هم سناریوهای تصویر-متن را بدون اتکا به سرویس‌های ابری انجام داد.

#Go #LLM #VLM #LocalInference #FFI #purego #llama #OnDeviceAI

🟣لینک مقاله:
https://golangweekly.com/link/175368/web


👑 @gopher_academy
Forwarded from Bardia & Erfan
This media is not supported in your browser
VIEW IN TELEGRAM
وقتی یک خط کد به پروزه اضافه میکنی😂
🐳3💋2🔥1