Forwarded from DevOps Labdon
🔵 عنوان مقاله
Enhance application quality with AI-powered test generation (3 minute read)
🟢 خلاصه مقاله:
مقالهای که مطالعه کردهاید، به بررسی نقش زوج GitLab و Amazon Q در خودکارسازی تولید آزمونهای واحدی جامع میپردازد، که به بهبود پوشش کد و انسجام آن کمک کرده و در عین حال، تلاشهای دستی را به طور قابل توجهی کاهش میدهد. این فرآیند با تحلیل کدهای جدید در زمان درخواستهای ادغام انجام میشود. هوش مصنوعی معرفی شده، آزمونهایی را تولید میکند که قادر به رویارویی با موارد حاشیهای و حفظ کیفیت در سراسر تیم توسعه است. این تکنولوژی نه تنها به افزایش کارایی کمک میکند بلکه اطمینان از کیفیت نرمافزار را نیز در طی فرآیندهای توسعه تضمین مینماید. از طریق این نوآوری، شرکتها میتوانند به سرعت و با اطمینان بیشتر نرمافزارهای خود را توسعه دهند.
🟣لینک مقاله:
https://about.gitlab.com/blog/enhance-application-quality-with-ai-powered-test-generation/?utm_source=tldrdevops
➖➖➖➖➖➖➖➖
👑 @DevOps_Labdon
Enhance application quality with AI-powered test generation (3 minute read)
🟢 خلاصه مقاله:
مقالهای که مطالعه کردهاید، به بررسی نقش زوج GitLab و Amazon Q در خودکارسازی تولید آزمونهای واحدی جامع میپردازد، که به بهبود پوشش کد و انسجام آن کمک کرده و در عین حال، تلاشهای دستی را به طور قابل توجهی کاهش میدهد. این فرآیند با تحلیل کدهای جدید در زمان درخواستهای ادغام انجام میشود. هوش مصنوعی معرفی شده، آزمونهایی را تولید میکند که قادر به رویارویی با موارد حاشیهای و حفظ کیفیت در سراسر تیم توسعه است. این تکنولوژی نه تنها به افزایش کارایی کمک میکند بلکه اطمینان از کیفیت نرمافزار را نیز در طی فرآیندهای توسعه تضمین مینماید. از طریق این نوآوری، شرکتها میتوانند به سرعت و با اطمینان بیشتر نرمافزارهای خود را توسعه دهند.
🟣لینک مقاله:
https://about.gitlab.com/blog/enhance-application-quality-with-ai-powered-test-generation/?utm_source=tldrdevops
➖➖➖➖➖➖➖➖
👑 @DevOps_Labdon
about.gitlab.com
Enhance application quality with AI-powered test generation
Learn how GitLab Duo with Amazon Q improves the QA process by automatically generating comprehensive unit tests.
❤1👍1
🔵 عنوان مقاله
go-quartz 0.15: Simple, Zero-Dependency Scheduling Library
🟢 خلاصه مقاله:
ابزار برنامهنویسی go-quartz با الهام از زمانبندی کوارتز در جاوا ساخته شده، که به آسانی در فرآیندهای گو اجرا میشود و امکان برنامهریزی اجرای وظایف و کارها را بر اساس زمانبندی مشخص فراهم میکند. این امر برای پروژههای نرمافزاری که نیاز به خودکارسازی کارهای منظم دارند مفید است.
🟣لینک مقاله:
https://golangweekly.com/link/172093/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
go-quartz 0.15: Simple, Zero-Dependency Scheduling Library
🟢 خلاصه مقاله:
ابزار برنامهنویسی go-quartz با الهام از زمانبندی کوارتز در جاوا ساخته شده، که به آسانی در فرآیندهای گو اجرا میشود و امکان برنامهریزی اجرای وظایف و کارها را بر اساس زمانبندی مشخص فراهم میکند. این امر برای پروژههای نرمافزاری که نیاز به خودکارسازی کارهای منظم دارند مفید است.
🟣لینک مقاله:
https://golangweekly.com/link/172093/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
GitHub
GitHub - reugn/go-quartz: Minimalist and zero-dependency scheduling library for Go
Minimalist and zero-dependency scheduling library for Go - reugn/go-quartz
❤2
🔵 عنوان مقاله
PocketBase: A Go-Powered Backend in One Binary
🟢 خلاصه مقاله:
این مقاله به توضیح ویژگیهای یک برنامه بکاند متنباز میپردازد که شامل دیتابیس SQLite توکار، پشتیبانی از اشتراکگذاری واقعیزمانی، مدیریت فایل و کاربر، یک رابط کاربری مدیر/داشبورد و API REST است. هدف اصلی آن، استفاده به عنوان بکاند برای اپلیکیشنهای جلویی (frontend) جاوااسکریپت میباشد. منابعی نظیر دموی زنده، مخزن گیتهاب و مستندات مفید نیز موجود هستند که برای توسعهدهندگان بسیار کاربردی میباشند.
🟣لینک مقاله:
https://golangweekly.com/link/172086/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
PocketBase: A Go-Powered Backend in One Binary
🟢 خلاصه مقاله:
این مقاله به توضیح ویژگیهای یک برنامه بکاند متنباز میپردازد که شامل دیتابیس SQLite توکار، پشتیبانی از اشتراکگذاری واقعیزمانی، مدیریت فایل و کاربر، یک رابط کاربری مدیر/داشبورد و API REST است. هدف اصلی آن، استفاده به عنوان بکاند برای اپلیکیشنهای جلویی (frontend) جاوااسکریپت میباشد. منابعی نظیر دموی زنده، مخزن گیتهاب و مستندات مفید نیز موجود هستند که برای توسعهدهندگان بسیار کاربردی میباشند.
🟣لینک مقاله:
https://golangweekly.com/link/172086/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
pocketbase.io
PocketBase - Open Source backend in 1 file
Open Source backend in 1 file with realtime database, authentication, file storage and admin dashboard
👍2
Forwarded from AI Labdon
هشدار سم آلتمن: اطلاعات خیلی شخصیتون رو تو ChatGPT ننویسید!
▪️سم آلتمن، مدیرعامل OpenAI، تو یه مصاحبه تازه گفته فعلاً نمیتونن تضمین کنن که اطلاعات خیلی حساس کاربرا توی چتباتها مثل ChatGPT کاملاً محرمانه بمونه.
▪️آلتمن توضیح داده وقتی از این ابزارها برای چیزایی مثل مشاوره احساسی یا حتی پزشکی استفاده میکنید، دیگه خبری از محرمانگیای مثل «پزشک و بیمار» نیست!
▪️چون هنوز چارچوب قانونی مشخصی برای گفتگو با هوش مصنوعی وجود نداره، اگه شکایتی مطرح بشه، ممکنه محتوای چتها به درخواست مراجع قانونی ارائه بشه
▪️سم آلتمن، مدیرعامل OpenAI، تو یه مصاحبه تازه گفته فعلاً نمیتونن تضمین کنن که اطلاعات خیلی حساس کاربرا توی چتباتها مثل ChatGPT کاملاً محرمانه بمونه.
▪️آلتمن توضیح داده وقتی از این ابزارها برای چیزایی مثل مشاوره احساسی یا حتی پزشکی استفاده میکنید، دیگه خبری از محرمانگیای مثل «پزشک و بیمار» نیست!
▪️چون هنوز چارچوب قانونی مشخصی برای گفتگو با هوش مصنوعی وجود نداره، اگه شکایتی مطرح بشه، ممکنه محتوای چتها به درخواست مراجع قانونی ارائه بشه
🔵 عنوان مقاله
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
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
Datadog
How Go 1.24's Swiss Tables saved us hundreds of gigabytes | Datadog
Go 1.24's Swiss Tables cut our map memory usage by up to 70% in high-traffic workloads. Here's how we profiled the savings and improved performance.
❤4 1
Gopher Academy
'Swiss Tables'
اگر میخواید در مورد swiss map ها اطلاعات بیشتر داشته باشید این رفرنس ها به شما کمک می کندد
https://www.dolthub.com/blog/2023-03-28-swiss-map/
https://www.youtube.com/watch?v=JZE3_0qvrMg
https://abseil.io/about/design/swisstables
https://www.youtube.com/watch?v=ncHmEUmJZf4
http://graphics.stanford.edu/~seander/bithacks.html##ValueInWord
https://aras-p.info/blog/2016/08/09/More-Hash-Function-Tests/
https://lemire.me/blog/2016/06/27/a-fast-alternative-to-the-modulo-reduction/
https://www.dolthub.com/blog/2023-03-28-swiss-map/
https://www.youtube.com/watch?v=JZE3_0qvrMg
https://abseil.io/about/design/swisstables
https://www.youtube.com/watch?v=ncHmEUmJZf4
http://graphics.stanford.edu/~seander/bithacks.html##ValueInWord
https://aras-p.info/blog/2016/08/09/More-Hash-Function-Tests/
https://lemire.me/blog/2016/06/27/a-fast-alternative-to-the-modulo-reduction/
Dolthub
SwissMap: A smaller, faster Golang Hash Table
Initial release of SwissMap, a Golang port of Abseil's flat_hash_map.
🍾2
🔵 عنوان مقاله
How to Use Go Tooling + Depot’s API to Outsource Container Builds
🟢 خلاصه مقاله:
مقاله به بررسی استفاده از ابزار "Depot" برای ساخت تصاویر بدون اعتماد به صورت سریع و امن میپردازد. "Depot" با کاهش پیچیدگیهای ارکستراسیون کانتینر، به توسعهدهندگان کمک میکند تا بدون نیاز به پیکربندیهای پیچیده، مستقیماً به مرحله استقرار بپردازند. این ابزار همچنین تأکید زیادی بر امنیت دارد و محیطی را فراهم میآورد که در آن تصاویر با اقدامات امنیتی پیشرفته ساخته میشوند که این امر خطرات احتمالی را کاهش میدهد. از سوی دیگر، "Depot" با اتوماتیک کردن فرآیندهای زمانبر، به افزایش کارایی کمک میکند و ابزاری ارزشمند در توسعه نرمافزار مدرن محسوب میشود.
🟣لینک مقاله:
https://golangweekly.com/link/172092/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
How to Use Go Tooling + Depot’s API to Outsource Container Builds
🟢 خلاصه مقاله:
مقاله به بررسی استفاده از ابزار "Depot" برای ساخت تصاویر بدون اعتماد به صورت سریع و امن میپردازد. "Depot" با کاهش پیچیدگیهای ارکستراسیون کانتینر، به توسعهدهندگان کمک میکند تا بدون نیاز به پیکربندیهای پیچیده، مستقیماً به مرحله استقرار بپردازند. این ابزار همچنین تأکید زیادی بر امنیت دارد و محیطی را فراهم میآورد که در آن تصاویر با اقدامات امنیتی پیشرفته ساخته میشوند که این امر خطرات احتمالی را کاهش میدهد. از سوی دیگر، "Depot" با اتوماتیک کردن فرآیندهای زمانبر، به افزایش کارایی کمک میکند و ابزاری ارزشمند در توسعه نرمافزار مدرن محسوب میشود.
🟣لینک مقاله:
https://golangweekly.com/link/172092/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Depot
Container security at scale: Building untrusted images safely
Many SaaS platforms need to run customer code securely and fast. Rather than building container infrastructure from scratch, you can use Depot's API to handle the heavy lifting. Here's how to build Go tooling that creates isolated projects, manages builds…
❤3
Forwarded from Bardia & Erfan
بازجویی دوباره از مدیرعامل تلگرام در فرانسه
▪️پاول دورف، مدیرعامل تلگرام، روز گذشته برای سومین بار در دادگاهی در پاریس حاضر شد تا به اتهاماتی مرتبط با تسهیل جرایم سازمانیافته در بستر این پیامرسان پاسخ دهد. او به همراه چهار وکیلش در جلسهای رسمی شرکت کرد.
▪️این پرونده مربوط به بازداشت دورف در سال ۲۰۲۴ در فرانسه است؛ موضوع اصلی، نقش احتمالی تلگرام در انتشار محتوای غیرقانونی و ضعف در نظارت بر آنهاست.
▪️تیم حقوقی او با انتشار بیانیهای تأکید کردهاند:
▪️پاول دورف، مدیرعامل تلگرام، روز گذشته برای سومین بار در دادگاهی در پاریس حاضر شد تا به اتهاماتی مرتبط با تسهیل جرایم سازمانیافته در بستر این پیامرسان پاسخ دهد. او به همراه چهار وکیلش در جلسهای رسمی شرکت کرد.
▪️این پرونده مربوط به بازداشت دورف در سال ۲۰۲۴ در فرانسه است؛ موضوع اصلی، نقش احتمالی تلگرام در انتشار محتوای غیرقانونی و ضعف در نظارت بر آنهاست.
▪️تیم حقوقی او با انتشار بیانیهای تأکید کردهاند:
«ما هم مشروعیت کیفرخواست صادرشده علیه موکلمان و هم روند بعضی از اقدامات تحقیقاتی را، که در تضاد با قوانین داخلی و مقررات اتحادیه اروپا بودهاند، بهطور جدی زیر سوال میبریم.»
🔵 عنوان مقاله
Integration Testing for Go Apps using Testcontainers and Containerized Databases
🟢 خلاصه مقاله:
Testcontainers به توسعهدهندگان امکان میدهد تا اپلیکیشنهای خود را به آزمون بگذارند بدون آنکه نیاز به مدیریت وابستگیهای واقعی و یا استفاده از خدمات تولیدی داشته باشند. این ابزار قادر است خدمات واقعی را فقط به مدت اجرای آزمونها به وجود آورد. استفاده از Testcontainers فرایند آزمون را موثرتر ساخته و اطمینان میدهد که هر آزمون در محیطی کنترل شده و بدون تداخل با دیگر آزمونها اجرا شود.
🟣لینک مقاله:
https://golangweekly.com/link/172081/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Integration Testing for Go Apps using Testcontainers and Containerized Databases
🟢 خلاصه مقاله:
Testcontainers به توسعهدهندگان امکان میدهد تا اپلیکیشنهای خود را به آزمون بگذارند بدون آنکه نیاز به مدیریت وابستگیهای واقعی و یا استفاده از خدمات تولیدی داشته باشند. این ابزار قادر است خدمات واقعی را فقط به مدت اجرای آزمونها به وجود آورد. استفاده از Testcontainers فرایند آزمون را موثرتر ساخته و اطمینان میدهد که هر آزمون در محیطی کنترل شده و بدون تداخل با دیگر آزمونها اجرا شود.
🟣لینک مقاله:
https://golangweekly.com/link/172081/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Microsoft News
Integration testing for Go applications using Testcontainers and containerized databases
Explore the Azure Cosmos DB Go SDK for effective integration testing with real service dependencies using Testcontainers.
❤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. 📄 تولید توضیحات و مستندات
* میتواند توضیحات برای توابع و کلاسها بنویسد.
* تولید فایل
6. ✅ پشتیبانی از چند زبان برنامهنویسی
* پشتیبانی از زبانهای معروف مثل:
* JavaScript / TypeScript
* Python
* Go
* Rust
* C++ / C#
* و بسیاری دیگر
---
🔐 امنیت و کنترل
* CodeRabbit برای بازبینی از مدلهایی مثل GPT-4 استفاده میکنه.
* امکان تعیین سطوح دسترسی و حریم خصوصی در تیمها وجود دارد.
* تنظیمات برای غیرفعال کردن ارسال کد به بیرون هم فراهم شده است.
---
💰 هزینه و نسخهها
* نسخه رایگان برای کاربران انفرادی (با محدودیت بررسی کد).
* نسخه تجاری / تیمی با امکانات بیشتر و اتصال به GitHub Enterprise.
---
🔗 لینکها
* وبسایت رسمی: [https://coderabbit.ai](https://coderabbit.ai)
* افزونه VS Code: قابل نصب از Marketplace با جستجوی
* GitHub App: [https://github.com/apps/coderabbit](https://github.com/apps/coderabbit)
---
🐰 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)
🍾2❤1
Forwarded from Gopher Academy
در Go، تفاوتهایی ظریف ولی مهم بین این سه نوع اعلان وجود دارد:
1.
2.
3.
هر یک از این موارد نشاندهنده یک نوع متفاوت از داده است که در ادامه به جزئیات و کاربردهای هر کدام میپردازیم:
### 1.
این متغیر یک اشارهگر (
#### توضیحات:
-ا
-ا
- این نوع اعلان زمانی استفاده میشود که نیاز دارید به جای اسلایس، به یک اشارهگر به اسلایس دسترسی داشته باشید، مثلاً وقتی میخواهید اسلایس را در یک تابع اصلاح کنید و تغییرات در خارج از تابع نیز منعکس شود.
### 2.
این متغیر یک اسلایس (
#### توضیحات:
-ا
-ا
- این نوع اعلان زمانی استفاده میشود که میخواهید به ساختارهای
### 3.
این متغیر یک اشارهگر (
#### توضیحات:
-ا
- ا
- این نوع اعلان زمانی مفید است که بخواهید اسلایس و عناصر آن را مستقیماً از طریق یک اشارهگر تغییر دهید، مانند اصلاح اسلایس و عناصر آن در یک تابع.
### خلاصه
-
-
-
هر کدام از این ساختارها کاربرد خاص خود را دارد و انتخاب صحیح بستگی به نیاز شما برای دستکاری دادهها و استفاده از اشارهگرها دارد.
➖➖➖➖➖➖➖➖
👑 @gopher_academy
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
🥂امروز ۸ مرداد دقیقا روزی بود که گوفر آکادمی متولد شد🎂
🍾توی این مسیر کلی چیز یادگرفتم و حتی کلی رفیق خوب پیدا کردم
👑روز های خوب و بد زیادی داشتم تا جای که بود تونستم مقالات مفید و بروز براتون بذارم
🌷کانال ما چهارشنبه ۸ مرداد سال ۹۹ شروع به فعالیت خودش کرد یعنی 5 سال میگذره از عمر این چنل (خیلی کوچیک بودیم اما زود بزرگ شدیم با تجربه تر شدیم در کنار شما)
🖐 دوستان این چنل ما رو حمایت کنید که همچنان با قدرت کارش رو ادامه بده👑🫡🍾🌷
💸🚬 به مناسبت این روز تخفیف 50 درصدی رو تمام تعرفه های تبلیغاتی چنل
➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖
🟢اگر تلگرام پرمیموم داری boost کن 👇
🔵 https://t.me/gopher_academy?boost
➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖
🟢لینک حمایت مالی👇
🔵 https://www.coffeete.ir/mrbardia72
➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖
🟢 اگرم سوالی نظری انتقادی بود درخدمتم👇
🔵 @mrbardia72
➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖
🟢اگر دنبال تبلیغ هستی اینجا پیام بده👇
🔵 @labdon_ads
Telegram
Gopher Academy
از این کانال حمایت کنید تا بتواند به قابلیتهای اضافی دسترسی پیدا کند.
🍾6❤4 1
Forwarded from Bardia & Erfan
نسخه 11.14 تلگرام منتشر شد
جستجوی پستها
حالا میتونی پستای کانالهای عمومی رو مستقیم سرچ کنی (فعلاً فقط برای پریمیومیها)
آلبوم استوری
استوریهاتو میتونی تو آلبوم بچینی، مثل خاطره سفر یا معرفی محصول تو کانالها
مجموعه هدیهها
هدایاتو دستهبندی کن! مثلا نایابها، موضوعیها و هرچی دلت خواست
امتیاز پروفایل
با خرید هدیه و پیام پولی، امتیاز میگیری و اعتبارت تو تلگرام بالا میره
هدایای خاص برای پریمیومیها
هدایای خفن و محدود فقط برای کاربرای پریمیوم میاد
مینیاپ جدید BotFather
رباتسازی راحتتر از همیشه شده؛ مستقیم از مینیاپ جدید مدیریت کن
جستجوی پستها
حالا میتونی پستای کانالهای عمومی رو مستقیم سرچ کنی (فعلاً فقط برای پریمیومیها)
آلبوم استوری
استوریهاتو میتونی تو آلبوم بچینی، مثل خاطره سفر یا معرفی محصول تو کانالها
مجموعه هدیهها
هدایاتو دستهبندی کن! مثلا نایابها، موضوعیها و هرچی دلت خواست
امتیاز پروفایل
با خرید هدیه و پیام پولی، امتیاز میگیری و اعتبارت تو تلگرام بالا میره
هدایای خاص برای پریمیومیها
هدایای خفن و محدود فقط برای کاربرای پریمیوم میاد
مینیاپ جدید 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
امکان غیرفعالسازی هوش مصنوعی
🔹ا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
❤3
استفاده از هوش مصنوعی در مصاحبههای شغلی متا آزاد شد!
▪️متا بهزودی به برنامهنویسهای تازهوارد اجازه میده حین تست کدنویسی از ابزارهای هوش مصنوعی استفاده کنن!
▪️چرا؟! چون اینطوری :
1. بهتر به واقعیت محیط کاری نزدیک میشن
2. جلوی تقلبهای پنهانی با AI گرفته میشه ، چون دیگه خود استفاده از AI بخشی از تست حساب میشه!
🧠 متا میگه آیندهی کدنویسی با هوش مصنوعیه، پس مصاحبهها هم باید با این واقعیت همسو بشن.
▪️متا بهزودی به برنامهنویسهای تازهوارد اجازه میده حین تست کدنویسی از ابزارهای هوش مصنوعی استفاده کنن!
▪️چرا؟! چون اینطوری :
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/>
وقتی نرخ ورود داده به میلیونها پیام در ثانیه میرسد، عامل تعیینکننده در یک معماری بهینه و سریع و موثر، نه ارتقای پرهزینهی سختافزار است و نه تکیه بر زیرساختهای سنگین ابری، بلکه یک طراحی دقیق، ساده و هوشمندانه است که میتواند تفاوت واقعی را رقم بزند.
اخیراً با مقالهای مواجه شدم که دقیقاً همین رویکرد را نشان میداد: تیمی که با استفاده از مفاهیم سبکوزن مانند 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/>
👍3❤2🍾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
“خب، 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
Medium
Graceful Shutdown in Go (Part 1): Build Production-Ready Services Without Dropping Requests
You should design your systems to fail gracefully. — Martin Fowler
❤7👍5🍾2
Forwarded from AI Labdon
عرفی هیولای جدید گوگل ؛ آیا با خطرناکترین هوش مصنوعی دنیا روبهرو هستیم؟
▪️گوگل بهتازگی از مدل پیشرفتهی خودش بهنام Gemini 2.5 Deep Think رونمایی کرده؛ مدلی که در آزمایشها حتی موفق به کسب مدال طلا در المپیاد جهانی ریاضی شده!
▪️این مدل فقط برای کاربران پلن Ultra با قیمت ماهانه 250 دلار در دسترسه و استفاده ازش با هشدارها و محدودیتهای خاصی همراهه.
▪️در تستهای داخلی تابستون 2024، گوگل رسماً اعلام کرده Deep Think در حال نزدیک شدن به مرزهاییست که ممکنه اون رو به ابزاری غیرقابل کنترل در دستان افراد نادرست تبدیل کنه
▪️گوگل بهتازگی از مدل پیشرفتهی خودش بهنام Gemini 2.5 Deep Think رونمایی کرده؛ مدلی که در آزمایشها حتی موفق به کسب مدال طلا در المپیاد جهانی ریاضی شده!
▪️این مدل فقط برای کاربران پلن Ultra با قیمت ماهانه 250 دلار در دسترسه و استفاده ازش با هشدارها و محدودیتهای خاصی همراهه.
▪️در تستهای داخلی تابستون 2024، گوگل رسماً اعلام کرده Deep Think در حال نزدیک شدن به مرزهاییست که ممکنه اون رو به ابزاری غیرقابل کنترل در دستان افراد نادرست تبدیل کنه
❤8
مقاله «Writing Go Code like a Pro!» در Go Chronicles، همراه با نکات مهم و مثالهای کوچک برای درک بهتر:
---
🧠 نکات کلیدی برای نوشتن کد حرفهای در Go
1. نامگذاری متغیرها و توابع
* از camelCase استفاده کنید و از snake\_case پرهیز شود.
مثال:
* نامها را کوتاه ولی واضح نگه دارید؛ بسته به scope، اسم کوتاهتر مناسبتر است.
* برای شاخص حلقهها از حروف تک مثل
> بیشترین زمان را برای خواندن کد دیگران میگذارید، پس کدی بنویسید که دیگران بدون دردسر بفهمند.
---
2. نامگذاری پکیجها
* نام پکیجها باید کوتاه، پاییننویس (lowercase) و معمولاً مفرد باشند (مثلاً
---
3. طراحی ساختار پروژه
* پروژههای کوچک: تمام فایلها در ریشه، مثل
* برای پروژههای با چند executable: ساختار پیشنهادی:
* فقط وقتی نیاز واقعی به جداکردن logic دارید، پکیج مجزا در
---
4. رعایت اصول Domain-Driven Structure
* پکیجها را براساس سرویسها و موجودیتهای دامنه تعریف کنید (مثلاً پکیجهایی مثل
* اجتناب از ساختار تقلیدی MVC یا مدلهایی که ممکن است منجر به circular dependency شود.
---
5. شروع ساده و افزایش تدریجی ساختار
* اگر ایدهای ندارید، فقط با
---
6. فایلهای مرتبط را کنار هم نگه دارید
* توابع مرتبط، typeها و handlerهای یک واحد منطقی را در فایلهای نزدیک یا مشابه قرار دهید؛ این کار خوانایی را بالا میبرد.
---
7. اندازه فایل مهم نیست... مگر نگهداری را دشوار کند
* فایلهای بزرگ ایرادی ندارند، تا وقتی که نگهداری آنها راحت باشد. لازم نیست برای چند فایل ساده، پکیج ایجاد کنید.
---
8. وقتی لازم نیست پکیج جدا نسازید
* از ایجاد پکیجهای کماهمیت یا بسیار جزئی خودداری کنید؛ مگر قصد reuse مجزا یا جداسازی واضح logic را داشته باشید.)
---
9. به علائم هشدار ساختار دقت کنید
اگر موارد زیر را دیدید، زمان بازبینی ساختار فرارسیده:
* مشکل در یافتن نقاط کد،
* تغییرات گسترده در بخشهای متفاوت،
* سخت شدن debug،
* وابستگی حلقوی یا پیچیدگی error handling.
---
💡 جمعبندی نهایی
* تأکید روی خوانایی، نگهداریپذیری و ساختار معقول.
* شروع از سادهترین حالت، حفظ نامگذاری استاندارد Go و اجتناب از ساختارهای پیچیده غیر idiomatic Go.
* اجازه دهید پروژه در طول زمان ساختار مناسب خودش را بیابد، نه طراحی اولیهی کاملاً دقیق.
---
🧠 نکات کلیدی برای نوشتن کد حرفهای در 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
📝 نکات کاربردی درباره
1. چهار روش نوشتن مختلف
*
بسته به نوع دادهای که در اختیار دارید، میتوانید روش مناسب را استفاده کنید
2. نحوه ذخیرهسازی داخلی
این نوع از یک slice داخلی استفاده میکند که نوشتنها به صورت
3. استفادهی بهینه با
قبل از نوشتن با حجم بالا، بهتر است با
* اگر ظرفیت فعلی کافی باشد، گسترش اتفاق نمیافتد.
* اگر ظرفیت کافی نباشد، با فرمول
4. عملکرد
متد
### 5. هرگز یک Builder غیرصفر را کپی نکنید
کپی کردن یک `strings.Builder` که قبلاً نوشته شده باشد منجر به panic میشود:
فقط اشیاء صفر مقدار (بدون نوشتن) قابل کپی هستند
6. عدم پشتیبانی همزمانی (Concurrency)
7. پیادهسازی
رابط
---
⚡️ مثال استفاده
در این مثال:
* از
* با ترکیب
* قابلیت گرفتن طول و ظرفیت نیز وجود دارد.
|
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
* تابع
*
*
---
3. مزایا و معایب
✅ مزایا:
* افزایش پوشش تست و کشف خطاهای نادیدهگرفتهشده: بهویژه برای parserها، handlers با JSON یا ورودی پیچیده
* سهولت استفاده: تست زیاد بدون نیاز به نوشتن دستی هزاران ورودی.
* هر بار موارد جالب کشفشده ذخیرهشده و قابل اجرای مجدد هستند
❌ معایب یا چالشها:
* نیاز به طراحی درست تابع تحت تست (مثلاً برگشت error برای ورودی نامعتبر مانند invalid UTF-8)
* زمانبر بودن تست: اجرای fuzz برای هزاران ورودی ممکن است زمان زیادی ببرد
* در مولفههای پیچیدهتر (مثلاً structهایی با فیلد private) ممکن است نیاز به ساخت custom generator باشد.
---
4. تجربه افراد و ابزارهای مکمل
* سیستمهایی مثل
* کتابخانههای property-based مانند
* جامعه توسعهدهندهها تجربههای بسیار مثبتی داشتهاند:
* در 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