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
🔵 عنوان مقاله
How Go 1.24's Swiss Tables 'Saved Us Hundreds of Gigabytes'

🟢 خلاصه مقاله:

در نسخه 1.24 زبان برنامه‌نویسی Go، پیاده‌سازی 'Swiss Tables' جدید به کاهش مصرف حافظه در نقشه‌های بزرگ در حافظه کمک کرده است. این بهبود از طریق پروفایل و اندازه‌گیری دقیق و بهینه‌سازی‌های سطح ساختار انجام شده، که در نهایت منجر به صرفه‌جویی‌های بزرگ در سطح انبوه شده است. این رویکرد نوآورانه نه تنها باعث کاهش استفاده از حافظه شده، بلکه سرعت دسترسی به داده‌ها را نیز حفظ یا بهبود بخشیده است.

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


👑 @gopher_academy
41
🔵 عنوان مقاله
How to Use Go Tooling + Depot’s API to Outsource Container Builds

🟢 خلاصه مقاله:

مقاله به بررسی استفاده از ابزار "Depot" برای ساخت تصاویر بدون اعتماد به صورت سریع و امن می‌پردازد. "Depot" با کاهش پیچیدگی‌های ارکستراسیون کانتینر، به توسعه‌دهندگان کمک می‌کند تا بدون نیاز به پیکربندی‌های پیچیده، مستقیماً به مرحله استقرار بپردازند. این ابزار همچنین تأکید زیادی بر امنیت دارد و محیطی را فراهم می‌آورد که در آن تصاویر با اقدامات امنیتی پیشرفته ساخته می‌شوند که این امر خطرات احتمالی را کاهش می‌دهد. از سوی دیگر، "Depot" با اتوماتیک کردن فرآیندهای زمان‌بر، به افزایش کارایی کمک می‌کند و ابزاری ارزشمند در توسعه نرم‌افزار مدرن محسوب می‌شود.

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


👑 @gopher_academy
3
Forwarded from 𓄂 Bardia 𓆃
بازجویی دوباره از مدیرعامل تلگرام در فرانسه

▪️پاول دورف، مدیرعامل تلگرام، روز گذشته برای سومین بار در دادگاهی در پاریس حاضر شد تا به اتهاماتی مرتبط با تسهیل جرایم سازمان‌یافته در بستر این پیام‌رسان پاسخ دهد. او به همراه چهار وکیلش در جلسه‌ای رسمی شرکت کرد.

▪️این پرونده مربوط به بازداشت دورف در سال ۲۰۲۴ در فرانسه است؛ موضوع اصلی، نقش احتمالی تلگرام در انتشار محتوای غیرقانونی و ضعف در نظارت بر آن‌هاست.

▪️تیم حقوقی او با انتشار بیانیه‌ای تأکید کرده‌اند:

«ما هم مشروعیت کیفرخواست صادرشده علیه موکل‌مان و هم روند بعضی از اقدامات تحقیقاتی را، که در تضاد با قوانین داخلی و مقررات اتحادیه اروپا بوده‌اند، به‌طور جدی زیر سوال می‌بریم.»
🔵 عنوان مقاله
Integration Testing for Go Apps using Testcontainers and Containerized Databases

🟢 خلاصه مقاله:

Testcontainers به توسعه‌دهندگان امکان می‌دهد تا اپلیکیشن‌های خود را به آزمون بگذارند بدون آنکه نیاز به مدیریت وابستگی‌های واقعی و یا استفاده از خدمات تولیدی داشته باشند. این ابزار قادر است خدمات واقعی را فقط به مدت اجرای آزمون‌ها به وجود آورد. استفاده از Testcontainers فرایند آزمون را موثرتر ساخته و اطمینان می‌دهد که هر آزمون در محیطی کنترل شده و بدون تداخل با دیگر آزمون‌ها اجرا شود.

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


👑 @gopher_academy
2
Forwarded from Software Engineer Labdon
ابزار CodeRabbit AI یک افزونه مبتنی بر هوش مصنوعی است که مخصوص کمک به توسعه‌دهندگان طراحی شده و در محیط‌هایی مثل VS Code قابل استفاده است. این ابزار از مدل‌های زبانی بزرگ (LLM) استفاده می‌کند تا درک عمیقی از کد شما داشته باشد و بتواند پیشنهادات هوشمندانه ارائه دهد.

---

🐰 CodeRabbit AI چیست؟

CodeRabbit AI در اصل یک دستیار کدنویسی مبتنی بر هوش مصنوعی است که تمرکز ویژه‌ای روی Code Review (بازبینی کد) دارد. این افزونه با استفاده از مدل‌های قدرتمند مثل GPT-4 می‌تواند مانند یک توسعه‌دهنده با تجربه کد شما را تحلیل کرده و فیدبک فنی ارائه دهد.

---

امکانات اصلی CodeRabbit AI:

1. 🔍 بازبینی خودکار کد (AI Code Review)

* با باز کردن یک Pull Request، CodeRabbit به‌طور خودکار کد را تحلیل کرده و بازخورد حرفه‌ای ارائه می‌دهد.
* بررسی می‌کند:

* خطاهای منطقی
* استانداردهای کدنویسی
* بهینه‌سازی عملکرد
* خوانایی و نگهداری کد

2. تولید کامنت‌های هوشمند در Pull Request

* در GitHub یا GitLab، CodeRabbit می‌تواند مثل یک همکار فنی به PR شما پاسخ دهد و کامنت بنویسد.

3. 💬 گفتگوی متنی روی کد

* امکان گفت‌وگو با هوش مصنوعی درباره کدی که نوشته‌اید (مانند ChatGPT اما داخل محیط IDE).

4. 🛠 پیشنهاد بهبود (Refactoring Suggestions)

* پیشنهادهایی برای ساده‌تر و خواناتر شدن کد ارائه می‌دهد.
* مثال: تغییر توابع طولانی، کاهش تکرار، نام‌گذاری بهتر متغیرها.

### 5. 📄 تولید توضیحات و مستندات

* می‌تواند توضیحات برای توابع و کلاس‌ها بنویسد.
* تولید فایل README.md یا خلاصه ویژگی‌ها.

6. پشتیبانی از چند زبان برنامه‌نویسی

* پشتیبانی از زبان‌های معروف مثل:

* JavaScript / TypeScript
* Python
* Go
* Rust
* C++ / C#
* و بسیاری دیگر

---

🔐 امنیت و کنترل

* CodeRabbit برای بازبینی از مدل‌هایی مثل GPT-4 استفاده می‌کنه.
* امکان تعیین سطوح دسترسی و حریم خصوصی در تیم‌ها وجود دارد.
* تنظیمات برای غیرفعال کردن ارسال کد به بیرون هم فراهم شده است.

---

💰 هزینه و نسخه‌ها

* نسخه رایگان برای کاربران انفرادی (با محدودیت بررسی کد).
* نسخه تجاری / تیمی با امکانات بیشتر و اتصال به GitHub Enterprise.

---

🔗 لینک‌ها

* وب‌سایت رسمی: [https://coderabbit.ai](https://coderabbit.ai)
* افزونه VS Code: قابل نصب از Marketplace با جستجوی CodeRabbit
* GitHub App: [https://github.com/apps/coderabbit](https://github.com/apps/coderabbit)
🍾21
Forwarded from Gopher Academy
در Go، تفاوت‌هایی ظریف ولی مهم بین این سه نوع اعلان وجود دارد:

1. var x *[]book
2. var a []*book
3. var b *[]*book

هر یک از این موارد نشان‌دهنده یک نوع متفاوت از داده است که در ادامه به جزئیات و کاربردهای هر کدام می‌پردازیم:

### 1. var x *[]book
این متغیر یک اشاره‌گر (pointer) به یک اسلایس (slice) از ساختار book است.

#### توضیحات:
x یک اشاره‌گر به یک اسلایس از نوع book است.
*[]book نشان‌دهنده یک اسلایس است که خود شامل عناصر book است.
- این نوع اعلان زمانی استفاده می‌شود که نیاز دارید به جای اسلایس، به یک اشاره‌گر به اسلایس دسترسی داشته باشید، مثلاً وقتی می‌خواهید اسلایس را در یک تابع اصلاح کنید و تغییرات در خارج از تابع نیز منعکس شود.


### 2. var a []*book
این متغیر یک اسلایس (slice) از اشاره‌گرها (pointers) به ساختار book است.

#### توضیحات:
a یک اسلایس است که هر عنصر آن یک اشاره‌گر به یک book است.
[]*book یک اسلایس است که در آن هر عنصر یک اشاره‌گر به نوع book است.
- این نوع اعلان زمانی استفاده می‌شود که می‌خواهید به ساختارهای book به صورت اشاره‌گر دسترسی داشته باشید، مثلاً وقتی می‌خواهید عناصر را مستقیماً اصلاح کنید بدون اینکه اسلایس یا مقدار جدیدی ساخته شود.


### 3. var b *[]*book
این متغیر یک اشاره‌گر (pointer) به یک اسلایس (slice) از اشاره‌گرها (pointers) به book است.

#### توضیحات:
b یک اشاره‌گر به اسلایسی است که هر عنصر آن یک اشاره‌گر به book است.
- ا*[]*book نشان‌دهنده یک اشاره‌گر به اسلایسی است که شامل اشاره‌گرهای به book می‌باشد.
- این نوع اعلان زمانی مفید است که بخواهید اسلایس و عناصر آن را مستقیماً از طریق یک اشاره‌گر تغییر دهید، مانند اصلاح اسلایس و عناصر آن در یک تابع.



### خلاصه
- var x *[]book: اشاره‌گر به یک اسلایس از book.
- var a []*book: اسلایسی از اشاره‌گرها به book.
- var b *[]*book: اشاره‌گر به یک اسلایس از اشاره‌گرها به book.

هر کدام از این ساختارها کاربرد خاص خود را دارد و انتخاب صحیح بستگی به نیاز شما برای دستکاری داده‌ها و استفاده از اشاره‌گرها دارد.


👑 @gopher_academy
8👍2🍾2
🎂🎊امروز زادروز چنل گوفر آکادمی هست🎊🎂

🥂امروز ۸ مرداد دقیقا روزی بود که گوفر آکادمی متولد شد🎂

🍾توی این مسیر کلی چیز یادگرفتم و حتی کلی رفیق خوب پیدا کردم

👑روز های خوب و بد زیادی داشتم تا جای که بود تونستم مقالات مفید و بروز براتون بذارم

🌷کانال ما چهارشنبه ۸ مرداد سال ۹۹ شروع به فعالیت خودش کرد یعنی 5 سال میگذره از عمر این چنل (خیلی کوچیک بودیم اما زود بزرگ شدیم با تجربه تر شدیم در کنار شما)

🖐 دوستان این چنل ما رو حمایت کنید که همچنان با قدرت کارش رو ادامه بده👑🫡🍾🌷

💸🚬 به مناسبت این روز تخفیف 50 درصدی رو تمام تعرفه های تبلیغاتی چنل


🟢اگر تلگرام پرمیموم داری boost کن 👇

🔵 https://t.me/gopher_academy?boost

🟢لینک حمایت مالی👇

🔵 https://www.coffeete.ir/mrbardia72

🟢 اگرم سوالی نظری انتقادی بود درخدمتم👇

🔵 @mrbardia72

🟢اگر دنبال تبلیغ هستی اینجا پیام بده👇
🔵 @labdon_ads
🍾641
Forwarded from 𓄂 Bardia 𓆃
نسخه 11.14 تلگرام منتشر شد

جستجوی پست‌ها
حالا می‌تونی پستای کانال‌های عمومی رو مستقیم سرچ کنی (فعلاً فقط برای پریمیومی‌ها)

آلبوم استوری
استوری‌هاتو می‌تونی تو آلبوم بچینی، مثل خاطره سفر یا معرفی محصول تو کانال‌ها

مجموعه هدیه‌ها
هدایاتو دسته‌بندی کن! مثلا نایاب‌ها، موضوعی‌ها و هرچی دلت خواست

امتیاز پروفایل
با خرید هدیه و پیام پولی، امتیاز می‌گیری و اعتبارت تو تلگرام بالا میره

هدایای خاص برای پریمیومی‌ها
هدایای خفن و محدود فقط برای کاربرای پریمیوم میاد

مینی‌اپ جدید BotFather
ربات‌سازی راحت‌تر از همیشه شده؛ مستقیم از مینی‌اپ جدید مدیریت کن
👍2
Forwarded from Software Engineer Labdon
🐧 ویرایشگر کد Zed :
امکان غیرفعال‌سازی هوش مصنوعی 

🔹اZed چیست؟
اZed یک ویرایشگر کد مدرن و متن‌باز است که ویژگی‌های منحصر‌به‌فردی ارائه می‌دهد: 
سبک و سریع (حتی روی سیستم‌های ضعیف) 
پشتیبانی از چندین زبان برنامه‌نویسی 
امکانات پیشرفته مانند دیباگر داخلی و Git Integration 

🔹 ویژگی جدید:
غیرفعال‌سازی هوش مصنوعی در آخرین آپدیت + امکان خاموش کردن کامل قابلیت‌های هوش مصنوعی اضافه شده است. 

🔸 مزایای این قابلیت:
- حفظ حریم خصوصی
(عدم ارسال کدها به سرورهای خارجی) 
- کاهش مصرف منابع سیستم 
- تمرکز بیشتر روی کدنویسی بدون مزاحمت پیشنهادات AI 
- امکان استفاده از مدل‌های محلی به جای سرویس ابری 

🔹 نحوه غیرفعال‌سازی:
- باز کردن تنظیمات (Ctrl+, یا Cmd+,) 
- جستجوی "AI" 
- غیرفعال کردن گزینه‌های مربوطه 

🔹 مقایسه با سایر ویرایشگرها:
- سرعت: Zed > VS Code > JetBrains 
- هوش مصنوعی: Zed (انعطاف‌پذیر) - VS Code (وابسته به افزونه) - JetBrains (پولی) 
- متن‌باز بودن: Zed و VS Code متن‌باز هستند 

🔹 دانلود:
🌐 وبسایت رسمی: zed.dev 
📥 برای ویندوز، مک و لینوکس در دسترس است.

👤 نویسنده: امیرحسین قاسم‌زاده
📚 منبع: zed.dev

https://t.me/addlist/QtXiQlynEJwzODBk
2
استفاده از هوش مصنوعی در مصاحبه‌های شغلی متا آزاد شد!

▪️متا به‌زودی به برنامه‌نویس‌های تازه‌وارد اجازه می‌ده حین تست کدنویسی از ابزارهای هوش مصنوعی استفاده کنن!

▪️چرا؟! چون اینطوری :

1. بهتر به واقعیت محیط کاری نزدیک می‌شن
2. جلوی تقلب‌های پنهانی با AI گرفته می‌شه ، چون دیگه خود استفاده از AI بخشی از تست حساب می‌شه!

🧠 متا می‌گه آینده‌ی کدنویسی با هوش مصنوعیه، پس مصاحبه‌ها هم باید با این واقعیت همسو بشن.
👍8🍾1
پردازش ۱.۲ میلیون پیام در ثانیه با Kafka و Go — معماری سبک اما حرفه‌ای

وقتی نرخ ورود داده به میلیون‌ها پیام در ثانیه می‌رسد، عامل تعیین‌کننده در یک معماری بهینه و سریع و موثر، نه ارتقای پرهزینه‌ی سخت‌افزار است و نه تکیه بر زیرساخت‌های سنگین ابری، بلکه یک طراحی دقیق، ساده و هوشمندانه است که می‌تواند تفاوت واقعی را رقم بزند.
اخیراً با مقاله‌ای مواجه شدم که دقیقاً همین رویکرد را نشان می‌داد: تیمی که با استفاده از مفاهیم سبک‌وزن مانند goroutine در Go و چند تصمیم مهندسی‌شده، توانسته بودند تنها با یک سخت‌افزار معمولی، بیش از ۱ میلیون پیام در ثانیه را به‌صورت پایدار پردازش کنند.
در این پست، به مرور نکات کلیدی این معماری ساده اما تأثیرگذار می‌پردازیم — روایتی کاربردی از دنیای مهندسی داده و سیستم‌های توزیع‌شده.

مقاله اصلی:
Kafka at 1M Messages/Second with Go – Our Exact Pipeline Setup

چالش‌ها:
- هجوم سنگین داده‌ها از دستگاه‌های IoT و کاربران
- نیاز به پردازش بلادرنگ و ارسال همزمان به چند سرویس
- تضمین پایداری، مانیتورینگ دقیق و ریکاوری خودکار در خطا

مکانیزم‌هایی که این معماری را ممکن کردند:
- کامیت دستی offsetها:
تأیید دریافت فقط زمانی انجام می‌شود که پیام کاملاً و با موفقیت پردازش شده باشد — جلوگیری از گم‌شدن یا پردازش تکراری داده‌ها.
- مکانیزم Worker Pool کنترل‌شده با goroutine:
به‌جای ایجاد goroutine برای هر پیام، یک استخر ثابت از goroutineها (به ازای هر پارتیشن کافکا) با طول کانال مشخص و محدود، تعریف شده است که پیام‌ها را موازی اما کنترل‌شده پردازش می‌کنند.
- یک Worker Pool به ازای هر پارتیشن Kafka:
مثلاً با ۱۰ پارتیشن و ۵ goroutine برای هر پارتیشن، در مجموع ۵۰ goroutine داریم — بدون هم‌پوشانی، بدون رقابت اضافه.
- الگوی Dispatcher برای جداسازی دریافت از پردازش:
- بخش اول: فقط دریافت پیام و ارسال به کانال داخلی (یک کانسیومر به ازای هر پارتیشن)
- بخش دوم: پردازش پیام از صف به کمک Worker Pool
- مکانیزم Batching در ارسال خروجی:
پیام‌های پردازش‌شده به‌صورت گروهی ارسال می‌شوند، مثلاً به دیتابیس یا تاپیک‌های دیگر Kafka. این کار فشار ارتباطی را کاهش داده و throughput را بالا برده است.
- اعمال Backpressure هوشمند:
با محدود کردن ظرفیت صف‌ها، اگر سیستم تحت فشار شدید قرار گیرد، مصرف از Kafka موقتاً کند یا متوقف می‌شود تا منابع آزاد شوند. این مکانیزم، از overload جلوگیری کرده و سیستم را در حالت پایدار نگه می‌دارد.
- مانیتورینگ دقیق با Prometheus و Grafana:
شاخص‌هایی مثل تأخیر پردازش، consumer lag و مصرف CPU به‌صورت لحظه‌ای مانیتور می‌شوند — برای تنظیم سریع و واکنش فوری.

نتایج:
- نرخ پردازش: ۱.۲M msg/sec
- تأخیر کل مسیر: <۳ms
- مصرف CPU: ۹۰٪ (پایدار و قابل پیش‌بینی)

نکات مهم برای مهندسان داده و سیستم‌های توزیع‌شده:
- طراحی درست مهم‌تر از افزایش منابع
- انجام commit دقیق، batching و backpressure = ستون‌های یک سیستم مقاوم
- تفکیک دریافت/پردازش + تقسیم کار بین پارتیشن‌ها = مقیاس‌پذیری مؤثر
- مانیتورینگ لحظه‌ای = پاسخ سریع به فشارها و خطاها

| <Mojtaba Banaie/>
👍32🍾2
ما وقتی برنامه Go مون رو می‌بندیم، فقط یه Ctrl+C می‌زنیم و می‌گیم:
“خب، shutdown شد!”
و تمام!
ولی واقعیت اینه که خاموش شدن یه سرویس واقعی، اونم توی Production،
خیلی بیشتر از یه سیگنال ساده‌ست.


اگه درست پیاده‌سازی نشه:
- ممکنه وسط ارسال درخواست، ارتباط قطع شه
- جاب‌ها در حال پردازش نصفه‌کاره بمونن
- کانکشن‌ها به دیتابیس یا Redis نشت کنن
- و حتی برنامه قبل از تموم شدن goroutineها، کلاً بسته شه


تو این مقاله، به‌صورت خلاصه نوشتم:
- چطور با signal.NotifyContext درست shutdown رو هندل کنیم
- چطور http.Server رو با Shutdown(ctx) ببندیم
- چطور workerها رو با context و sync.WaitGroup تمیز ببندیم
- و تو Kubernetes چطور از terminationGracePeriodSeconds درست استفاده کنیم

https://medium.com/@a.mousavi/graceful-shutdown-in-go-part-1-build-production-ready-services-without-dropping-requests-b55934c217c1
7👍5🍾2
Forwarded from AI Labdon
عرفی هیولای جدید گوگل ؛ آیا با خطرناک‌ترین هوش مصنوعی دنیا روبه‌رو هستیم؟

▪️گوگل به‌تازگی از مدل پیشرفته‌ی خودش به‌نام Gemini 2.5 Deep Think رونمایی کرده؛ مدلی که در آزمایش‌ها حتی موفق به کسب مدال طلا در المپیاد جهانی ریاضی شده!

▪️این مدل فقط برای کاربران پلن Ultra با قیمت ماهانه 250 دلار در دسترسه و استفاده ازش با هشدارها و محدودیت‌های خاصی همراهه.

▪️در تست‌های داخلی تابستون 2024، گوگل رسماً اعلام کرده Deep Think در حال نزدیک شدن به مرزهایی‌ست که ممکنه اون رو به ابزاری غیرقابل کنترل در دستان افراد نادرست تبدیل کنه
8
مقاله «Writing Go Code like a Pro!» در Go Chronicles، همراه با نکات مهم و مثال‌های کوچک برای درک بهتر:

---

🧠 نکات کلیدی برای نوشتن کد حرفه‌ای در Go

1. نام‌گذاری متغیرها و توابع

* از camelCase استفاده کنید و از snake\_case پرهیز شود.
مثال: myVariable بجای my_variable ☑️
* نام‌ها را کوتاه ولی واضح نگه دارید؛ بسته به scope، اسم کوتاه‌تر مناسب‌تر است.
* برای شاخص‌ حلقه‌ها از حروف تک مثل i استفاده کنید، نه index.

> بیشترین زمان را برای خواندن کد دیگران می‌گذارید، پس کدی بنویسید که دیگران بدون دردسر بفهمند.

---

2. نام‌گذاری پکیج‌ها

* نام پکیج‌ها باید کوتاه، پایین‌نویس (lowercase) و معمولاً مفرد باشند (مثلاً service بجای services, utils توصیه نمی‌شود).

---

3. طراحی ساختار پروژه

* پروژه‌های کوچک: تمام فایل‌ها در ریشه، مثل main.go.
* برای پروژه‌های با چند executable: ساختار پیشنهادی:


cmd/
app1/
app2/
internal/
go.mod
README.md

* فقط وقتی نیاز واقعی به جداکردن logic دارید، پکیج مجزا در internal/ بسازید.

---

4. رعایت اصول Domain-Driven Structure

* پکیج‌ها را براساس سرویس‌ها و موجودیت‌های دامنه تعریف کنید (مثلاً پکیج‌هایی مثل account, inventory).
* اجتناب از ساختار تقلیدی MVC یا مدل‌هایی که ممکن است منجر به circular dependency شود.

---

5. شروع ساده و افزایش تدریجی ساختار

* اگر ایده‌ای ندارید، فقط با go.mod و main.go شروع کنید؛ بعد با رشد پروژه، نیاز به طبقه‌بندی دقیق‌تر را تشخیص دهید. شروع مینیمال، کد قابل نگهداری را تسهیل می‌کند.

---

6. فایل‌های مرتبط را کنار هم نگه دارید

* توابع مرتبط، typeها و handlerهای یک واحد منطقی را در فایل‌های نزدیک یا مشابه قرار دهید؛ این کار خوانایی را بالا می‌برد.

---

7. اندازه فایل مهم نیست... مگر نگهداری را دشوار کند

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

---

8. وقتی لازم نیست پکیج جدا نسازید

* از ایجاد پکیج‌های کم‌اهمیت یا بسیار جزئی خودداری کنید؛ مگر قصد reuse مجزا یا جداسازی واضح logic را داشته باشید.)

---

9. به علائم هشدار ساختار دقت کنید

اگر موارد زیر را دیدید، زمان بازبینی ساختار فرارسیده:

* مشکل در یافتن نقاط کد،
* تغییرات گسترده در بخش‌های متفاوت،
* سخت شدن debug،
* وابستگی حلقوی یا پیچیدگی error handling.

---

💡 جمع‌بندی نهایی

* تأکید روی خوانایی، نگهداری‌پذیری و ساختار معقول.
* شروع از ساده‌ترین حالت، حفظ نام‌گذاری استاندارد Go و اجتناب از ساختارهای پیچیده غیر idiomatic Go.
* اجازه دهید پروژه در طول زمان ساختار مناسب خودش را بیابد، نه طراحی اولیه‌ی کاملاً دقیق.
4👍2
📝 نکات کاربردی درباره strings.Builder

1. چهار روش نوشتن مختلف

strings.Builder از چهار روش برای افزودن محتوا پشتیبانی می‌کند:

* Write([]byte), WriteByte(byte), WriteRune(rune), WriteString(string)
بسته به نوع داده‌ای که در اختیار دارید، می‌توانید روش مناسب را استفاده کنید

2. نحوه ذخیره‌سازی داخلی

این نوع از یک slice داخلی استفاده می‌کند که نوشتن‌ها به صورت append در آن انجام می‌شوند. بنابراین عملکرد آن مشابه append روی slice است

3. استفاده‌ی بهینه با Grow(n)

قبل از نوشتن با حجم بالا، بهتر است با Grow(n) ظرفیت را از پیش افزایش دهید تا از realloc جلوگیری شود:

* اگر ظرفیت فعلی کافی باشد، گسترش اتفاق نمی‌افتد.
* اگر ظرفیت کافی نباشد، با فرمول current_capacity*2 + n افزایش پیدا می‌کند

4. عملکرد String()

متد String() بدون تخصیص حافظه اضافی، یک رشته جدید از buffer داخلی ایجاد می‌کند—با استفاده از `unsafe`، فقط اشاره‌گر را باز می‌گرداند

### 5. هرگز یک Builder غیرصفر را کپی نکنید

کپی کردن یک `strings.Builder` که قبلاً نوشته شده باشد منجر به panic می‌شود:

var b1 strings.Builder
b1.WriteString("ABC")
b2 := b1
b2.WriteString("DEF") // panic!


فقط اشیاء صفر مقدار (بدون نوشتن) قابل کپی هستند

6. عدم پشتیبانی هم‌زمانی (Concurrency)

strings.Builder ایمن برای استفاده هم‌زمان از چند goroutine نیست؛ خواندن یا نوشتن هم‌زمان می‌تواند منجر به نتایج غیرمنتظره شود

7. پیاده‌سازی io.Writer

رابط Write(p []byte) (int, error) پیاده‌سازی شده است، بنابراین می‌توانید از strings.Builder به عنوان یک io.Writer استفاده کنید—مثلاً log‌سازی، fmt.Fprintf و …

---

⚡️ مثال استفاده

package main

import (
"fmt"
"strings"
)

func main() {
var sb strings.Builder
sb.Grow(100)

sb.WriteString("Hello")
sb.WriteByte(' ')
sb.WriteRune('世')
sb.WriteString("界")

fmt.Println(sb.String()) // خروجی: "Hello 世界"
fmt.Printf("Len=%d, Cap=%d\n", sb.Len(), sb.Cap())
}


در این مثال:

* از Grow(100) برای کاهش realloc استفاده کردیم.
* با ترکیب WriteString, WriteByte, و WriteRune یک رشته UTF‑8 ساختیم.
* قابلیت گرفتن طول و ظرفیت نیز وجود دارد.
|
5👍2
چی هست fuzz testing؟

* در Go 1.18، fuzz testing به‌صورت داخلی وارد stdlib شد**؛ ابزاری که به‌طور خودکار ورودی‌های تصادفی تولید کرده و تابع مورد نظر را تست می‌کند تا **Bugها و edge caseها را بیابد
* برخلاف تست‌های واحد که ورودی‌های مشخص دارند، fuzz با تکیه بر یک seed corpus (مثلاً تعدادی ورودی اولیه) شروع گرفته و بر اساس راهنمای پوشش کد تست را گسترش می‌دهد، مسیرهای جدید کد را کشف می‌کند و موارد جالبی تولید می‌کند که تست‌های سنتی ممکن است پوشش ندهند

---

2. نحوه نوشتن fuzz test در Go

func FuzzReverse(f *testing.F) {
f.Add("abc") // seed اولیه
f.Add("bb")
f.Fuzz(func(t *testing.T, str string) {
rev1 := Reverse(str)
rev2 := Reverse(rev1)
if str != rev2 {
t.Errorf("fuzz test failed: %q became %q", str, rev1)
}
if utf8.ValidString(str) && !utf8.ValidString(rev1) {
t.Errorf("invalid utf-8 after reverse: %q", rev1)
}
})
}


* تابع FuzzXXX در فایل تست نوشته می‌شود؛
* f.Add(...) ورودی‌های اولیه را مشخص می‌کند (seed corpus)؛
* f.Fuzz(...) تابع تست را با signature مشخص اجرا می‌کند و Go وظیفه دارد ورودی‌های جدید را تولید و اجرا کند

---

3. مزایا و معایب

مزایا:

* افزایش پوشش تست و کشف خطاهای نادیده‌گرفته‌شده: به‌ویژه برای parserها، handlers با JSON یا ورودی پیچیده
* سهولت استفاده: تست زیاد بدون نیاز به نوشتن دستی هزاران ورودی.
* هر بار موارد جالب کشف‌شده ذخیره‌شده و قابل اجرای مجدد هستند

معایب یا چالش‌ها:

* نیاز به طراحی درست تابع تحت تست (مثلاً برگشت error برای ورودی نامعتبر مانند invalid UTF-8)
* زمان‌بر بودن تست: اجرای fuzz برای هزاران ورودی ممکن است زمان زیادی ببرد
* در مولفه‌های پیچیده‌تر (مثلاً structهایی با فیلد private) ممکن است نیاز به ساخت custom generator باشد.

---

4. تجربه افراد و ابزارهای مکمل

* سیستم‌هایی مثل go-fuzz (پیش از نسخه رسمی Go) برای fuzz کردن بسته‌های Go استفاده می‌شد و بسیار موثر بود
* کتابخانه‌های property-based مانند pgregory.net/rapid گزینه‌ی جایگزینی هستند که قابلیت‌های پیشرفته توليد داده، مینیمال‌سازی خطاها و persistence را ارائه می‌دهند
* جامعه توسعه‌دهنده‌ها تجربه‌های بسیار مثبتی داشته‌اند:
4
Forwarded from Software Engineer Labdon
🌟 ۵ استراتژی کلیدی برای دسترسی بالا (High Availability)

۱. 🍎 Load Balancing

توزیع هوشمند درخواست‌ها به سرورهای مختلف با در نظر گرفتن معیارهایی مثل مصرف CPU، حافظه و زمان پاسخ‌گویی. این کار از بارگذاری بیش‌ازحد یک سرور جلوگیری کرده و تضمین دسترسی مناسب را فراهم می‌کند

۲. 🔁 Data Redundancy with Isolation

ایجاد نسخه‌های متعدد از داده‌ها در دیتاسنترها یا مناطق مختلف (AZ/Region) برای جلوگیری از توقف سرویس در صورت خرابی یک محل. تکنیک‌هایی مثل replication و توزیع داده استفاده می‌شود

۳. 🛠 Failover

راه‌اندازی خودکار سرویس‌های پشتیبان (standby) که در صورت خرابی سرور اصلی، بدون وقفه بارکاری را ادامه دهند. این امکان از طریق load balancer، دیتابیس یا سرویس‌های کاربردی قابل اجراست

۴. 📈 Auto Scaling

تنظیم خودکار مقیاس منابع در مواجهه با افزایش یا کاهش بار. منابع مانند VM، کانتینر یا فانکشن سرورلس به کلود یا سیستم مدیریت اختصاصی اضافه و حذف می‌شوند

۵. 🚦 Rate Limiting

اعمال محدودیت در تعداد درخواست‌های دریافتی (مثلاً تعداد مشخص در هر ثانیه یا دقیقه) در لایه‌های مختلف مثل load balancer یا خود سرور. جلوگیری از overload سیستم و تضمین تجربه کاربری پایدار را ممکن می‌کند

---

🧭 چرا این روش‌ها مهم‌اند؟

* با ترکیب این استراتژی‌ها می‌تونی سیستم‌ت رو به‌گونه‌ای طراحی کنی که حتی در صورت خرابی یا حمله ناگهانی، ادامه به‌کار دهد.
* هر مورد از این استراتژی‌ها یک جنبه‌ی خاص از پایداری مثل توزیع بار، حفاظت داده‌ها یا کنترل درخواست را پوشش می‌دهد.
* این اصول نمایانگر مفاهیمی مثل حذف Single Point of Failure، failover خودکار، کشش دینامیک و کنترل ترافیک هستند.

---

🧩 سایر رویکردها که ممکنه مفید باشن:

* Redundancy + Fault Tolerance: استفاده از سرورهای active-active یا active-passive در داده‌سنترهای مختلف به‌همراه clustering و heartbeat برای مانیتورینگ خودکار .
* Distributed Storage & Replication: برای پایداری داده و تحمل خرابی در نودهای جغرافیایی متعدد
* Monitoring, Health Checks, Graceful Degradation: پیاده‌سازی مانیتورینگ لحظه‌ای، بررسی سلامت سرویس و ارائه fallback مناسب در شرایط بحرانی برای حفظ تجربه کاربری

---

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

این پنج استراتژی (Load Balancing، Data Redundancy، Failover، Auto Scaling، Rate Limiting) پایه‌ای‌ترین اصول برای طراحی سیستم‌های با High Availability هستند. با اجرای مناسب آن‌ها می‌تونی سطح دسترسی بالا، مقاومت در برابر خطا و تجربه‌ی بدون وقفه‌ای برای کاربران فراهم کنی.



https://t.me/addlist/QtXiQlynEJwzODBk
👍21
🏗 مراحل کامپایل در زبان Go

کامپایلر Go شامل مراحل زیر هست:

Source Code → Tokenizing → Parsing → AST → Type Checking → IR → SSA → Machine Code



1. Tokenizing (Lexical Analysis)

کد به اجزای کوچکتر مثل if, for, x, +, 123 تجزیه می‌شه.
این کار توسط lexer انجام می‌شه.

2. Parsing (Syntax Analysis)

از توکن‌ها یک درخت نحوی یا AST (Abstract Syntax Tree) ساخته می‌شه.
مثلاً a + b به شکل درختی با + به عنوان ریشه و a و b به عنوان فرزندها تحلیل می‌شه.

3. Type Checking

بررسی می‌کنه که همه چیز از نظر نوع (type) درسته یا نه:

آیا a + b مجازه؟ (آیا a و b عدد هستن؟)

آیا تابعی با امضای درست فراخوانی شده؟

4. Intermediate Representation (IR)

کد به فرم میانی ترجمه می‌شه که خواندن و بهینه‌سازی روش راحت‌تره.
Go از فرم SSA (Static Single Assignment) استفاده می‌کنه (در مرحله بعد توضیح داده می‌شه).

5. SSA (Static Single Assignment)

در این مدل، هر متغیر فقط یک‌بار مقداردهی می‌شه.
این به کامپایلر کمک می‌کنه که راحت‌تر بهینه‌سازی انجام بده، مثلاً:

حذف کدهای مرده

inline کردن توابع

بهینه‌سازی حلقه‌ها

6. Code Generation

در نهایت، از SSA کد ماشین تولید می‌شه (برای لینوکس/ویندوز/مک، معماری x86/ARM و…).
3👍2
Gopher Academy
🏗 مراحل کامپایل در زبان Go کامپایلر Go شامل مراحل زیر هست: Source Code → Tokenizing → Parsing → AST → Type Checking → IR → SSA → Machine Code 1. Tokenizing (Lexical Analysis) کد به اجزای کوچکتر مثل if, for, x, +, 123 تجزیه می‌شه. این کار توسط lexer انجام…
🌀 چرا Go سریع کامپایل می‌کنه؟

* کامپایلر Go فایل‌ها رو به صورت مستقل کامپایل می‌کنه (no header files مثل C/C++)
* importها فقط به شکل explicit مجاز هستن (هیچ چیزی مخفیانه load نمی‌شه)
* فرم SSA بسیار بهینه و کم‌حجم هست
* استفاده از حافظه‌ی کم در زمان build

---

🧪 مثال عملی (build داخلی Go)
اگر این کد رو ذخیره کنی:

package main

import "fmt"

func main() {
fmt.Println("Hello, Go!")
}


و بعد دستور زیر رو بزنی:

go build -x main.go


می‌بینی که این مراحل اتفاق می‌افته:

WORK=/tmp/go-build123456
mkdir -p $WORK/b001/
compile -> main.a
link -> main binary


---

🧰 ابزار مفید: go tool compile و go tool objdump

اگه بخوای دقیق‌تر رفتار کامپایلر رو ببینی:

1. فقط کامپایل کن بدون لینک:

go tool compile -S main.go


این دستور خروجی اسمبلی (Assembly) کد رو نشون می‌ده.

2. آنالیز باینری نهایی:

go tool objdump ./main


https://t.me/addlist/QtXiQlynEJwzODBk
👍2🔥1🍾1