Gopher Academy
3.33K subscribers
923 photos
40 videos
280 files
2.07K links
🕸 Gopher Academy

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

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

ادمین:
@mrbardia72
Download Telegram
اخیراً فرصتی شد که سراغ Goravel برم و کمی باهاش کار کنم.
فریموورک Goravel در واقع یک فریم‌ورک شبیه به Laravel اما برای زبان Go هست. چیزی که برام خیلی جالب بود اینه که دقیقا همون حس و حال لاراول رو منتقل می‌کنه؛ از ساختار پوشه‌ها گرفته تا ORM به سبک Eloquent، migrationها و حتی سیستم queue و job.
اگر قبلاً با Laravel کار کرده باشید، ورود به Goravel خیلی راحت میشه و می‌تونید سریع پروژه‌هاتون رو توی Go استارت بزنید. سرعت بالای Go هم در کنار معماری آشنا و تمیز لاراول باعث میشه تجربه جذابی باشه.
به نظرم برای کسایی که دنبال قدرت و سرعت Go هستن ولی در عین حال نمی‌خوان از دنیای راحتی و productivity لاراول جدا بشن، Goravel می‌تونه انتخاب خیلی خوبی باشه.
لینک پروژه:
https://goravel.dev

<ehsan moradi/>
🐳1🍾1👨‍💻1
🔵 عنوان مقاله
Observe Live SQL Queries in Go with DTrace

🟢 خلاصه مقاله:
این مطلب از Golang Weekly نشان می‌دهد چطور با استفاده از DTrace بدون تغییر کد و توقف سرویس، کوئری‌های SQL را در برنامه‌های Go به‌صورت زنده مشاهده کنیم. نویسنده با معرفی کوتاهی از DTrace به‌عنوان یک ابزار ردیابی پویا و کم‌سربار، قدم‌به‌قدم نحوه راه‌اندازی روی سیستم‌عامل‌های پشتیبانی‌شده، اتصال به پردازه در حال اجرا و نوشتن اسکریپت‌های ساده برای دیدن متن کوئری، زمان اجرا و الگوهای فراوانی را توضیح می‌دهد؛ همراه با فیلترگذاری برای محدود کردن خروجی به سرویس/کاربر/درایور موردنظر و نکاتی برای حفظ سربار کم.

کاربرد این روش، عیب‌یابی سریع مسائلی مثل کوئری‌های کند، الگوهای N+1، شاخص‌های مفقود و ORM پرحرف در شرایط واقعی تولید است. این رویکرد مکمل لاگ‌ها و APM است و امکان تشخیص فوری و تأیید سریع اصلاحات را می‌دهد. در بخش ملاحظات، به تفاوت پشتیبانی پلتفرم‌ها (مثل FreeBSD و برخی نسخه‌های macOS؛ و پیشنهاد eBPF روی Linux)، نیاز به دسترسی‌های بالا، حساسیت داده‌های متنی کوئری و ضرورت سنجش سربار در محیط staging اشاره می‌شود.

#Go #DTrace #SQL #Observability #Performance #GolangWeekly #eBPF #Database

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


👑 @gopher_academy
🔥2
الگوهای مهم Concurrency توی Golang
گاهی وقتا توی Go، کار کردن با concurrency فقط goroutine و channel نیست، یه سری الگو هست که وقتی یاد گرفتم واقعا دیدم کار رو راحت‌تر می‌کنن. مثلا یکی از اینا fan-out/fan-in هست. یعنی فرض کن چند تا goroutine داری که همزمان دارن یه سری داده رو پردازش می‌کنن (این میشه fan-out) و بعد همه‌شون خروجیشون رو میریزن توی یه کانال واحد تا جمع بشه (fan-in). من معمولا اینو وقتی استفاده می‌کنم که یه عالمه فایل یا دیتا دارم که میشه به صورت موازی روشون کار کرد. یه بار برای پردازش لاگ‌ها ازش استفاده کردم، هر worker یه بخش لاگ رو می‌خوند و پردازش می‌کرد و در نهایت همه‌ی نتایج توی یه جا جمع می‌شد.
یه الگوی دیگه که خیلی پرکاربرده worker pool ـه. به جای اینکه برای هر کاری یه goroutine جدا درست کنم، میام یه تعداد ثابت worker درست می‌کنم، مثلا ۵ تا، و همه‌ی کارها رو میریزم توی یه صف. workerها یکی‌یکی برمی‌دارن و انجام میدن. اینجوری هم منابع مصرف نمی‌شن هم قابل مدیریت‌تره. مثلا وقتی می‌خواستم ایمیل انبوه بفرستم، با worker pool خیلی راحت مدیریت کردم که سیستم منفجر نشه.
یه چیزی که همیشه باید حواسم باشه، محدود کردن هم‌زمانی یا همون bounded concurrency هست. مثلا وقتی می‌خوام به یه API خارجی درخواست بزنم، اگه بذارم ۱۰۰ تا goroutine همزمان بزنن، خیلی راحت اون سرویس منو بلاک می‌کنه یا خودم دچار timeout می‌شم. اینجاست که با یه کانال ساده یا semaphore جلوی تعداد درخواست‌ها رو می‌گیرم، مثلا نهایتا ۱۰ تا همزمان.
حالا مشکل بعدی backpressure ـه. این زمانی اتفاق میفته که producer سریع‌تر از consumer کار می‌کنه. مثلا تصور کن داری رویدادها رو از یه سیستم دیگه می‌گیری ولی پردازشت کندتره. اگه هیچ محدودیتی نباشه، حافظه‌ت پر میشه. من معمولا با کانال‌های buffer‌دار اینو مدیریت می‌کنم؛ وقتی بافر پر میشه producer گیر می‌کنه تا consumer کمی جلو بیفته. یه بار اینو توی سیستم لاگینگ پیاده کردم، به جای اینکه همه‌ی لاگ‌ها رو بدون کنترل بخوره، با backpressure سرعت متعادل شد.
یه چیز مهم دیگه cancellation ـه. بارها پیش اومده یه کاری رو استارت زدم ولی دیگه نیاز نبوده ادامه پیدا کنه. مثلا یه درخواست HTTP طولانی بود و کاربر صفحه رو بست. با context خیلی راحت میشه اینو مدیریت کرد، وقتی سیگنال cancel بیاد، همه‌ی goroutineهای مربوطه متوقف می‌شن. این باعث میشه منابع الکی مصرف نشن.
در نهایت هم timeout. خیلی وقتا نمی‌خوای یه عملیات تا ابد ادامه پیدا کنه. مثلا وقتی به یه سرویس بیرونی وصل میشی، میگی اگه بیشتر از ۲ ثانیه طول کشید، دیگه مهم نیست جواب چی بود، تمومش کن. این کار نه تنها سیستم رو responsive نگه می‌داره، بلکه از گیر کردن کل برنامه جلوگیری می‌کنه.

<Mohammad Salehi/>
1
🔵 عنوان مقاله
Building a Simple Stack-Based Virtual Machine in Go

🟢 خلاصه مقاله:
** این مقاله از Phakorn Kiong با یک نمونه عملی نشان می‌دهد چگونه در Go یک VM ساده مبتنی بر Stack بسازیم. هسته سیستم شامل bytecode، یک instruction pointer، یک stack برای داده‌ها و چند opcode پایه مثل PUSH، POP، ADD، SUB، MUL، DIV، PRINT و HALT است. اجرای برنامه به‌صورت حلقه fetch–decode–execute انجام می‌شود؛ هر opcode خوانده می‌شود، عمل مربوط روی stack اجرا می‌گردد و IP جلو می‌رود. قالب bytecode ساده است و مقادیر یا به‌صورت فوری یا از یک constant pool خوانده می‌شوند. برای پایداری، کنترل خطاهایی مثل stack underflow/overflow و division by zero در نظر گرفته شده است. نمونه‌هایی مثل محاسبه و چاپ 2*(3+4) برای تست آورده می‌شود و می‌توان یک assembler کوچک برای تولید bytecode اضافه کرد. مسیرهای توسعه شامل کنترل جریان (JMP/JZ)، مقایسه‌ها (EQ/LT/GT)، متغیرها با LOAD/STORE، و توابع با CALL/RET است؛ همچنین ابزارهایی مانند tracer، disassembler، REPL و تست‌ها پیشنهاد می‌شوند. هدف مقاله آموزشی است و “Here’s the code” کد کامل و خوانا را برای شروع و گسترش فراهم می‌کند.

#Go #Golang #VirtualMachine #StackVM #Bytecode #Interpreter #Compiler #SystemsProgramming

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


👑 @gopher_academy
1
واسه برنامه نویسی سیستمی کدوم رو ترجیح میدید؟
البته: با توضیح زیر در نظر بگیرید و انتخاب کنید
اگر می‌خوای کاملاً به سخت‌افزار نزدیک باشی → برو سراغ C. اگر می‌خوای ساختار بهتر + سرعت بالا داشته باشی → C++. اگر برات ایمنی و مدرن بودن مهمه → Rust.
Anonymous Poll
35%
C
36%
C++
53%
Rust
🍾2🐳1💋1
🔵 عنوان مقاله
explains more, including why this matters.

🟢 خلاصه مقاله:
آخرین شماره Golang Weekly مقاله‌ای دارد که یک موضوع به‌روز در اکوسیستم Go را با زمینه‌سازی روشن و کاربردی شرح می‌دهد: چرا اکنون مهم است، چه مزایا و ملاحظاتی دارد و چه بده‌بستان‌هایی پیشِ‌روست. با توضیح‌های فشرده و مثال‌های قابل اتکا، الگوهای مناسب تولید، خطاهای رایج و مسیرهای مهاجرت برای سرویس‌ها و کتابخانه‌ها را نشان می‌دهد. همچنین به پیامدهای معمول چنین تغییراتی بر modules، مدیریت وابستگی، CI، راهبرد تست، بنچ‌مارک و پروفایلینگ می‌پردازد و راهکارهایی برای کاهش ریسک و سازگاری پیشنهاد می‌کند. در پایان، اثر آن بر جامعه و تیم‌ها را جمع‌بندی کرده و منابع تکمیلی برای مطالعه بیش‌تر معرفی می‌کند؛ نکاتی عملی، چه برای بک‌اند‌های پُرترافیک و چه برای CLIهای کوچک.

#Go #Golang #GolangWeekly #SoftwareEngineering #Backend #DevOps #Performance #Concurrency

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


👑 @gopher_academy
👍1🔥1
🔵 عنوان مقاله
koanf 2.3: Read Configuration with Multiple Sources and Formats

🟢 خلاصه مقاله:
اkoanf 2.3 ابزاری برای خواندن و ترکیب پیکربندی از چند منبع و چند فرمت است؛ از JSON، TOML و YAML تا متغیرهای محیطی، command line، فایل‌های محلی و سرویس‌های ابری مانند S3. شما می‌توانید این منابع را لایه‌بندی کنید، قواعد تقدم و ادغام تعیین کنید و بدین‌ترتیب رفتار پیکربندی را در محیط‌های مختلف کنترل کنید. این نسخه به‌عنوان جایگزینی «سبک‌تر» برای Viper معرفی می‌شود و با تکیه بر سادگی، وابستگی‌های کمتر و API جمع‌وجور، ادغام و نگه‌داری را آسان‌تر می‌کند.

#koanf #Configuration #Viper #JSON #YAML #TOML #S3 #DevOps

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


👑 @gopher_academy
💯2👍1
🤲 درود به همه دوستان عزیز، امیدوارم حال دلتون همیشه خوب و شاد باشه.

🤍 چند وقت پیش به یه مقاله خیلی جذاب در مورد Memory Allocation برخوردم و تصمیم گرفتم بخش به بخشش رو اینجا براتون توضیح بدم تا همه بتونیم بهتر درکش کنیم.

❤️ خوشحال میشم اگر با اشتراک‌گذاری این پست به دیده شدن بیشترش کمک کنید.

💙 اگر گروه یا کانالی دارید، ممنون میشم اونجا هم بفرستید تا بقیه هم استفاده کنن.

💚 این مقاله رو پین می‌کنم و هر بخش جدید که گذاشتم، لینک همون قسمت رو اینجا آپدیت می‌کنم.

🎃سر فصل های مقاله رو اینجا گذاشتم

👇👇👇👇👇👇👇

@gopher_academy
📌 Memory Allocation in Go


🔹 در این پست به بررسی جزئیات مدیریت حافظه در زبان Go می‌پردازیم.

درک درست از ساختار حافظه به شما کمک می‌کند عملکرد برنامه‌هایتان را بهتر بهینه کنید و رفتار Garbage Collector را بهتر بفهمید.

🔵 Introduction
🔴 https://t.iss.one/gopher_academy/4231

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

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

🔵 Span and Size Class
🔴

🔵Span Class
🔴

🔵Span Set
🔴

🔵 Heap Bits and Malloc Header
🔴

🔵 Heap Management
🔴

🔵 Span Allocation: mheap.alloc
🔴

🔵Central Span Manager: mcentral
🔴

🔵Processor’s Memory Allocator: mcache
🔴

🔵 Heap Allocation
🔴

🔵Tiny Objects: mallocgcTiny
🔴

🔵 Small Objects: mallocgcSmall*
🔴

🔵 Large Objects: mallocgcLarge
🔴

🔵Stack Management
🔴

🔵Allocating Stack: stackalloc
🔴

🔵 Stack Growth: morestack
🔴

🔵Reusing Stack: stackfree
🔴

🔵 Stack or Heap?
🔴

🔵 Case Studies
🔴


👑 @gopher_academy
1
Gopher Academy pinned «📌 Memory Allocation in Go 🔹 در این پست به بررسی جزئیات مدیریت حافظه در زبان Go می‌پردازیم. درک درست از ساختار حافظه به شما کمک می‌کند عملکرد برنامه‌هایتان را بهتر بهینه کنید و رفتار Garbage Collector را بهتر بفهمید. 🔵 Introduction 🔴 https://t.iss.one/gopher_academy/4231…»
🔵 عنوان مقاله
the WebAssembly 3.0 standard is now 'live'

🟢 خلاصه مقاله:
** استاندارد WebAssembly 3.0 رسماً منتشر شده و هم‌اکنون در اکثر مرورگرهای مدرن در دسترس است. این نسخه با افزودن قابلیت‌هایی مانند garbage collection، tail calls و exception handling تمرکز خود را بر بهبود بلندمدت interoperability گذاشته و هدفش آسان‌تر شدن ادغام با زبان‌ها و ابزارهای مختلف است. پشتیبانی استاندارد از GC مسیر زبان‌های با runtime مدیریت‌شده را هموارتر می‌کند، حجم باینری‌ها را کاهش می‌دهد و راه‌اندازی را سریع‌تر می‌سازد؛ در عین حال tail calls کارایی الگوهای بازگشتی را بالاتر می‌برد و exception handling مدیریت خطا را ساخت‌یافته‌تر می‌کند. WebAssembly 3.0 با حفظ backward compatibility اجازه می‌دهد باینری‌های فعلی بدون تغییر اجرا شوند و ابزارها به‌تدریج قابلیت‌های جدید را پشتیبانی کنند.

#WebAssembly #Wasm30 #Browsers #Interoperability #GarbageCollection #TailCalls #ExceptionHandling #WebStandards

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


👑 @gopher_academy
3
🔵 عنوان مقاله
Why I Ditched Docker for Podman (And You Should Too)

🟢 خلاصه مقاله:
مهاجرت از Docker به Podman برای من بیشتر یک انتخاب عملی بود تا بحث سلیقه؛ به‌ویژه در جریان‌های کاری مرتبط با Go که در Golang Weekly هم زیاد دیده می‌شود. دلیل اصلی، معماری ساده‌تر و امن‌تر Podman است: بدون daemon و با اجرای rootless به‌صورت پیش‌فرض، پس سطح حمله و دردسرهای دسترسی کاهش می‌یابد و سرویس پرامتیازِ دائمی لازم نیست. مهاجرت هم کم‌اصطکاک است؛ چون Podman با CLI و فرمت OCI سازگار است و دستورات رایج مثل podman build/run عملاً جایگزین مستقیم می‌شوند. برای Compose، ابزار Podman Compose و برای رابط گرافیکی، Podman Desktop وجود دارد؛ روی macOS و Windows هم podman machine تجربه‌ای سبک و قابل‌اتکا می‌دهد. ادغام بومی با systemd، مدیریت لاگ‌ها و قابلیت‌هایی مثل pods و podman generate kube، راه را برای استفاده در CI/CD و حتی انتقال به Kubernetes هموار می‌کند. در پروژه‌های Go، ساخت چندمرحله‌ای، ایمیج‌های کم‌حجم، و mountهای rootless بدون مشکل دسترسی، چرخه توسعه و تست را سریع و قابل‌اعتماد می‌کند. هرچند تفاوت‌هایی مثل مسیر socket و جزئیات volumes نسبت به Docker وجود دارد، اما راهکارهای روشن و مستندی برایشان هست. نتیجه: اگر Docker جواب‌گو است، خوب؛ اما Podman در اکثر سناریوهای روزمره توسعه و CI تجربه‌ای امن‌تر، ساده‌تر و سازگار ارائه می‌دهد.

#Podman #Docker #Containers #DevOps #Go #GolangWeekly #Kubernetes #Security

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


👑 @gopher_academy
3
🔵 عنوان مقاله
How Fast is Go? Simulating Millions of Particles on a Smart TV

🟢 خلاصه مقاله:
این مقاله با اجرای یک شبیه‌سازی بزرگ روی یک Smart TV نشان می‌دهد Go در عمل چقدر سریع است. نتیجه اصلی: شبیه‌سازی ۲.۵ میلیون ذره با نرخ ۶۰ فریم‌برثانیه و هم‌زمان ارسال داده با ۳۰ فریم‌برثانیه به بیش از ۳۰۰ کلاینت (و احتمالاً تا حدود هزار) ممکن شده است. ترکیب کار محاسباتی سنگین و ارسال شبکه هم‌زمان، توان Go در مدیریت بارهای بلادرنگ و استفاده مؤثر از همزمانی را نشان می‌دهد. با بهینه‌سازی تخصیص حافظه و استفاده از الگوهای همزمانی Go، تأثیر GC کم و تأخیر قابل‌پیش‌بینی باقی مانده و سیستم روی دستگاهی محدود مثل Smart TV نیز پایدار عمل می‌کند.

#Go #Golang #Performance #Concurrency #RealTime #SmartTV #Simulation #Scalability

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


👑 @gopher_academy
🍾22
ریال ریال درمیاریم ولی دلار دلار باید خرج کنیم💔
274👍4
🎙️ عنوان پادکست:
Go gets audited, and Ian Lance Taylor talks about 19 years on the Go team
خلاصه پادکست:
**
در این مطلب، از ممیزی امنیتی زیرساخت رمزنگاری Go و گفت‌وگوی مفصل با Ian Lance Taylor درباره ۱۹ سال حضورش در تیم Go خبر داده می‌شود. ممیزی به رهبری Roland Shoemaker و Filippo Valsorda انجام شده و همراه با بررسی‌های عملی درباره FIPS در Episode 89 با Alex Scheel، بر اهمیت سخت‌گیری امنیتی و الزامات انطباق تأکید دارد. در حوزه طراحی زبان، پیشنهاد x/exp/xiter برای افزودن iterator adapters رد شد تا بر اولویت سادگی و پایداری در اکوسیستم Go تأکید شود....
🔥1
🎙️ عنوان پادکست:
👕 Clothe your naked gophers and returns, with this one weird episode THEY don't want you to know about!
خلاصه پادکست:
این هفته در دنیای Go، دو نسخه نگهداری Go 1.25.1 و Go 1.24.7 منتشر شدند که باگ‌ها و بهبودهای پایداری (و احتمالا امنیتی) را در کامپایلر، کتابخانه استاندارد و ابزارها ارائه می‌کنند؛ ارتقا برای محیط‌های تولیدی توصیه می‌شود. ویدیوهای GopherCon Europe: Berlin 2025 هم در دسترس است و موضوعاتی از طراحی زبان تا سیستم‌های توزیع‌شده و بهینه‌سازی عملکرد را پوشش می‌دهد....
2
🔵 عنوان مقاله
Go's Support for Valgrind Instrumentation

🟢 خلاصه مقاله:
این مقاله درباره پشتیبانی آزمایشی Go از Valgrind است؛ چارچوبی که با ابزارهایی مانند Memcheck، Helgrind، DRD، Cachegrind، Callgrind و Massif برای پروفایلینگ و یافتن خطاهای حافظه و هم‌زمانی به‌کار می‌رود. با این پشتیبانی، برنامه‌های Go می‌توانند به شکل عمیق‌تری پایش شوند—به‌ویژه در مرزهای cgo—و علاوه بر ابزارهای داخلی مانند pprof و race detector، گزینه‌های تشخیصی بیشتری در اختیار دارند. بااین‌حال، به دلیل سربار اجرایی بالا و ماهیت آزمایشی، نتایج ممکن است شامل خطا یا مثبت کاذب باشد و بهتر است با بیلدهای دیباگ و بارهای کاری کنترل‌شده استفاده شود. این قابلیت مکمل ابزارهای بومی Go است و جایگزین آن‌ها محسوب نمی‌شود.
#Go #Valgrind #Instrumentation #Profiling #MemoryLeaks #Concurrency #Performance #Debugging

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


👑 @gopher_academy
2
Gopher Academy
📌 Memory Allocation in Go 🔹 در این پست به بررسی جزئیات مدیریت حافظه در زبان Go می‌پردازیم. درک درست از ساختار حافظه به شما کمک می‌کند عملکرد برنامه‌هایتان را بهتر بهینه کنید و رفتار Garbage Collector را بهتر بفهمید. 🔵 Introduction 🔴 https://t.iss.one/gopher_academy/4231…
🔹 Introduction – Memory Allocation in Go


مدیریت حافظه بخش حیاتی هر زبان برنامه‌نویسی است و Go هم از این قاعده مستثنی نیست. سرعت و کارایی برنامه‌های Go به شدت وابسته به نحوه تخصیص و مدیریت حافظه است.

هرچند Go با APIهای ساده‌ای مثل new(T), &T{} و make پیچیدگی‌ها را از دید برنامه‌نویس پنهان می‌کند، اما درک سازوکار پشت پرده به ما کمک می‌کند:

* بفهمیم چگونه runtime بازدهی بالایی دارد،
* نقاط ضعف و گلوگاه‌های احتمالی را شناسایی کنیم.

در این سری قرار است:

* با اجزای اصلی memory allocator در Go آشنا شویم،
* نحوه مدیریت حافظه برای اشیاء کوچک، متوسط و بزرگ را ببینیم،
* مدیریت stack در کنار heap را بررسی کنیم،
* و در نهایت با مطالعه case studyها**، تأثیر عملی این استراتژی‌ها را در برنامه‌های واقعی درک کنیم.

قبل از ورود به جزئیات، بهتر است مفاهیم پایه‌ای **Virtual Memory
در سیستم‌عامل مرور شود.


👑 @gopher_academy
1
Gopher Academy
📌 Memory Allocation in Go 🔹 در این پست به بررسی جزئیات مدیریت حافظه در زبان Go می‌پردازیم. درک درست از ساختار حافظه به شما کمک می‌کند عملکرد برنامه‌هایتان را بهتر بهینه کنید و رفتار Garbage Collector را بهتر بفهمید. 🔵 Introduction 🔴 https://t.iss.one/gopher_academy/4231…
🔹 Go’s View of Virtual Memory


یک برنامه Go در اصل یک پردازش فضای کاربر (user-space process) است و همان چیدمان استاندارد حافظه مجازی (Stack, Heap, BSS, Data) را دارد.

در Stack، Go از استک خاصی به نام g0 stack استفاده می‌کند که به نخ اصلی runtime (m0) متصل است.

متغیرهای global که مقدار اولیه دارند در بخش Data ذخیره می‌شوند، و متغیرهای global بدون مقدار اولیه در بخش BSS قرار می‌گیرند.

بر خلاف زبان‌های سنتی مثل C که از Heap زیر program break استفاده می‌کنند، Go این Heap سنتی را برای اشیای خود به کار نمی‌برد.

به جای آن، Go برای تخصیص حافظه اشیای heap و استک گوروتین‌ها از memory-mapped segments استفاده می‌کند.

از اینجا به بعد، وقتی از "heap" در Go صحبت می‌کنیم، منظور همان بخش memory-mapped است (و نه heap سنتی زیر program break).

👉 به زبان ساده: Go یک heap اختصاصی روی memory-mapped segments می‌سازد و مدیریت حافظه را خودش انجام می‌دهد، نه اینکه از heap پیش‌فرض سیستم عامل استفاده کند.


👑 @gopher_academy
1🔥1
Gopher Academy
📌 Memory Allocation in Go 🔹 در این پست به بررسی جزئیات مدیریت حافظه در زبان Go می‌پردازیم. درک درست از ساختار حافظه به شما کمک می‌کند عملکرد برنامه‌هایتان را بهتر بهینه کنید و رفتار Garbage Collector را بهتر بفهمید. 🔵 Introduction 🔴 https://t.iss.one/gopher_academy/4231…
برای مدیریت بهینه‌ی حافظه، Go حافظه‌ی تخصیص‌داده‌شده از طریق memory mapping را به واحدهای سلسله‌مراتبی تقسیم می‌کند:

ساختار حافظه:

Arena (۶۴MB)

بزرگ‌ترین واحد تخصیص در Go.

هر Arena فضایی به اندازه‌ی ثابت ۶۴MB دارد.

اGo سعی می‌کند Arenaها رو پشت‌سر هم قرار بده، ولی همیشه تضمین نمی‌شه (به خاطر رفتار mmap).

Page (۸KB)

هر Arena به صفحات (Page) تقسیم می‌شود.
سایز هر Page: ۸KB.
این Pageها با Pageهای سیستم‌عامل (معمولاً ۴KB) متفاوت هستند.
تخصیص اشیاء:
اگر اندازه‌ی شیء کوچک‌تر از ۸KB باشد → چندین شیء در یک Page جا می‌گیرند.

اگر اندازه‌ی شیء دقیقاً ۸KB باشد → کل Page را اشغال می‌کند.
اگر اندازه‌ی شیء بزرگ‌تر از ۸KB باشد → روی چند Page گسترده می‌شود.

اGoroutine Stack
استک هر goroutine در همین Pageها نگهداری می‌شود.
هر استک در ابتدا فقط ۲KB است.
بنابراین یک Page (۸KB) می‌تواند تا ۴ goroutine stack را در خود جا دهد.

به زبان ساده:
اGo حافظه را اول به Arena (۶۴MB) تقسیم می‌کند، سپس هر Arena را به Page (۸KB) می‌شکند و این Pageها برای اشیاء مختلف یا استک goroutineها استفاده می‌شوند.

👑 @gopher_academy
1👍1🏆1