Gopher Academy
3.87K subscribers
930 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
🔵 عنوان مقاله
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
🔵 عنوان مقاله
qjs: Run JavaScript in Go

🟢 خلاصه مقاله:
qjs یک روش تازه برای اجرای JavaScript داخل اپ‌های Go است که بدون نیاز به Cgo کار می‌کند. به‌جای اتصال به یک کتابخانه بومی، نسخه فورک‌شده‌ای از QuickJS را به WebAssembly کامپایل کرده و آن را زیر Wazero اجرا می‌کند. این رویکرد کل زنجیره را در محیط خالص Go نگه می‌دارد و فرایند بیلد، استاتیک‌سازی و کراس‌کامپایل را ساده‌تر می‌کند. مزیت دیگر، ایزوله‌سازی و سندباکس طبیعی ناشی از WebAssembly است. هرچند احتمالاً نسبت به اتصال بومی اندکی سربار دارد، اما برای سناریوهایی مثل اسکریپت‌نویسی، افزونه‌ها و اجرای امن منطق کاربر، توازن خوبی بین سادگی، پرتابل‌بودن و امنیت ارائه می‌دهد.

#Go #JavaScript #WebAssembly #Wazero #QuickJS #Cgo #GoLang #Embedding

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


👑 @gopher_academy
🔵 عنوان مقاله
Terminating Elegantly: A Guide to Graceful Shutdowns

🟢 خلاصه مقاله:
ترک شایسته در سرویس‌ها یعنی برنامه بتواند با دریافت SIGTERM، بدون از دست دادن داده یا خراب کردن وضعیت، درخواست‌های جاری را تمام کند و منابع را درست آزاد کند. در این ارائه، Alex Pliutau با تمرکز بر Go در Kubernetes، چرخه کامل خاتمه را توضیح می‌دهد: از دریافت سیگنال و قطع‌کردن ترافیک تا ضرب‌الاجل SIGKILL.

نکته‌های کلیدی شامل این‌هاست: استفاده از signal.NotifyContext و context برای لغو هماهنگ، مدیریت goroutineها با sync.WaitGroup، فراخوانی http.Server.Shutdown یا معادل gRPC برای تخلیه امن اتصال‌ها، و توقف گرفتن کار جدید در Workerها درحالی‌که کارهای درحال اجرا به‌صورت زمان‌دار تمام می‌شوند. در Kubernetes باید readiness زودتر غیرفعال شود تا Pod از مسیر ترافیک خارج شود، از preStop برای تأخیر یا Drain سفارشی کمک بگیرید، و terminationGracePeriodSeconds را درست تنظیم کنید. پایش و آزمون نیز ضروری است: لاگ شروع/پایان Shutdown، سنجه‌هایی مثل تعداد درخواست‌های درحال پردازش و زمان خاتمه، و تست SIGTERM تحت بار. رعایت این الگوهای ساده، خاتمه‌ای قابل اعتماد و بدون اختلال در Go روی Kubernetes فراهم می‌کند.

#Go #Kubernetes #GracefulShutdown #CloudNative #Microservices #DevOps #Reliability #ProductionOps

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


👑 @gopher_academy
🔵 عنوان مقاله
Go v1.25.2 and v1.24.8 have been released

🟢 خلاصه مقاله:
به‌روزرسانی‌های Go در نسخه‌های v1.25.2 و v1.24.8 منتشر شده‌اند که مجموعه‌ای از اصلاحات امنیتی را در بسته‌های مختلف ارائه می‌کند. این نسخه‌ها از نوع وصله‌ای و سازگار به عقب هستند و بدون تغییر در رفتار زبان، امنیت و پایداری ابزارها و کتابخانه‌ها را بهبود می‌دهند. توصیه می‌شود هرچه سریع‌تر به آخرین وصله در شاخه فعلی‌تان ارتقا دهید (برای v1.25 به v1.25.2 و برای v1.24 به v1.24.8)، یادداشت‌های انتشار و هر CVE مرتبط را بررسی کنید، باینری‌ها را مجدداً بسازید و ابزارهایی مانند govulncheck را برای شناسایی وابستگی‌های آسیب‌پذیر اجرا کنید.

#Go #Golang #Security #Update #PatchRelease #CVE #DevOps #SoftwareMaintenance

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


👑 @gopher_academy
👍1
Gopher Academy
📌 Memory Allocation in Go این پست اپدیت می‌شود 🔹 در این پست به بررسی جزئیات مدیریت حافظه در زبان Go می‌پردازیم. درک درست از ساختار حافظه به شما کمک می‌کند عملکرد برنامه‌هایتان را بهتر بهینه کنید و رفتار Garbage Collector را بهتر بفهمید. 🔵 Introduction…
🧱 Heap Management در Go

در Go، مفهوم heap با چیزی که در سیستم‌عامل می‌شناسیم فرق داره.
Go روی memory-mapped segments، یه لایه‌ی مخصوص خودش ساخته به نام mheap 🧠

🔹 mheap مرکز فرماندهی حافظه‌ست:

اختصاص (allocate) اسپن‌های جدید

پاک‌سازی (sweep) اسپن‌های بدون استفاده

مدیریت حافظه‌ی مربوط به goroutine stack‌ها

به بیان ساده، mheap مثل یک مدیر حافظه‌ی مرکزی عمل می‌کنه که کل heap و stackهای goroutine‌ها رو زیر نظر داره.

👑 @gopher_academy
Gopher Academy
📌 Memory Allocation in Go این پست اپدیت می‌شود 🔹 در این پست به بررسی جزئیات مدیریت حافظه در زبان Go می‌پردازیم. درک درست از ساختار حافظه به شما کمک می‌کند عملکرد برنامه‌هایتان را بهتر بهینه کنید و رفتار Garbage Collector را بهتر بفهمید. 🔵 Introduction…
⚙️ Span Allocation: mheap.alloc

در فضای عظیم آدرس مجازی، پیدا کردن چند صفحه‌ی آزاد پشت سر هم (contiguous pages) کار ساده‌ای نیست — مخصوصاً وقتی چندین goroutine همزمان در حال تخصیص حافظه‌ان 😵‍💫

در نسخه‌های اولیه‌ی Go، تمام عملیات‌های mheap به‌صورت global sync انجام می‌شدن، یعنی فقط یک goroutine در آنِ واحد می‌تونست حافظه بگیره یا آزاد کنه.
نتیجه؟ 🔻 سرعت کم و افزایش latency در بارهای زیاد.

🧠 اما Go جدید با طراحی جدیدی به نام Scalable Page Allocator این مشکل رو حل کرده:

تقسیم‌بندی allocator برای کاهش قفل‌گذاری (lock contention)

تخصیص هم‌زمان و مستقل در چندین CPU

بهبود چشمگیر throughput در workloadهای سنگین

در واقع، mheap.alloc امروزی طوری طراحی شده که بتونه در محیط‌های بسیار concurrent هم حافظه رو سریع و هوشمند مدیریت کنه 🚀

👑 @gopher_academy
Gopher Academy
📌 Memory Allocation in Go این پست اپدیت می‌شود 🔹 در این پست به بررسی جزئیات مدیریت حافظه در زبان Go می‌پردازیم. درک درست از ساختار حافظه به شما کمک می‌کند عملکرد برنامه‌هایتان را بهتر بهینه کنید و رفتار Garbage Collector را بهتر بفهمید. 🔵 Introduction…
📦 Tracking Free Pages

در Go، فضای آدرس مجازی بسیار بزرگه، بنابراین برای مشخص کردن وضعیت هر صفحه (آزاد یا در حال استفاده) از bitmap استفاده می‌شه

در این bitmap:

1 = صفحه در حال استفاده (توسط span)

0 = صفحه آزاد

🔹 هر bitmap شامل ۸ عدد uint64 هست (یعنی ۶۴ بایت) و وضعیت ۵۱۲ صفحه‌ی متوالی رو نگه می‌داره.
🔹 از اون‌جا که هر arena در Go اندازه‌ی ۶۴ مگابایت داره و هر صفحه ۸ کیلوبایت هست، پس در هر arena:

۸۱۹۲ صفحه داریم

۱۶ تا bitmap برای پوشش کل صفحات

در مجموع فقط ۱ کیلوبایت حافظه برای ذخیره‌ی وضعیت کل صفحات لازمه! ⚡️

اما مشکل: پیمایش bitmap برای پیدا کردن صفحات آزاد هنوز کند بود
برای حل این، Go مفهومی به نام Summary معرفی کرد که سه ویژگی داره:

start → تعداد صفرهای پشت سر هم از ابتدای bitmap

end → تعداد صفرهای پشت سر هم از انتهای bitmap

max → طولانی‌ترین دنباله‌ی صفرها در کل bitmap

هر بار که صفحه‌ای allocate یا free می‌شه، این summary بلافاصله به‌روزرسانی می‌شه تا Go بتونه خیلی سریع‌تر صفحات آزاد رو پیدا کنه 🚀

👑 @gopher_academy
Gopher Academy
📌 Memory Allocation in Go این پست اپدیت می‌شود 🔹 در این پست به بررسی جزئیات مدیریت حافظه در زبان Go می‌پردازیم. درک درست از ساختار حافظه به شما کمک می‌کند عملکرد برنامه‌هایتان را بهتر بهینه کنید و رفتار Garbage Collector را بهتر بفهمید. 🔵 Introduction…
🧩 Bitmap Summary در مدیریت صفحات Go

در این شکل، هر بیت از bitmap نشان‌دهنده‌ی وضعیت یک صفحه‌ی حافظه است:

0 → صفحه آزاد (free)

1 → صفحه در حال استفاده (allocated)

برای بهینه‌سازی جستجوی صفحات آزاد، Go برای هر bitmap سه مقدار خلاصه‌شده (summary) نگه می‌داره:

start = 3 → یعنی در ابتدای bitmap، ۳ صفحه‌ی متوالی آزاد داریم

end = 7 → یعنی در انتهای bitmap، ۷ صفحه‌ی متوالی آزاد داریم

max = 10 → طولانی‌ترین دنباله‌ی صفحات آزاد در کل bitmap برابر با ۱۰ صفحه است

🔹 فلش در تصویر جهت افزایش آدرس حافظه (از پایین به بالا) رو نشون می‌ده.
در نتیجه، ۳ صفحه‌ی آزاد در بخش پایین‌تر حافظه (low address) و ۷ صفحه‌ی آزاد در بالاترین بخش (high address) قرار دارن.


این ساختار باعث می‌شه Go خیلی سریع‌تر بتونه محدوده‌های بزرگ از صفحات آزاد رو پیدا کنه بدون این‌که کل bitmap رو اسکن کنه — فقط با نگاه کردن به summaryها! ⚡️

👑 @gopher_academy