Gopher Academy
3.33K subscribers
917 photos
40 videos
279 files
1.97K links
🕸 Gopher Academy

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

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

ادمین:
@mrbardia72
Download Telegram
🔵 عنوان مقاله
sync.Map: The Right Tool for the Right Job

🟢 خلاصه مقاله:
مقاله اخیر Phuong، که جدیدترین بخش از راهنمای تصویری محبوب او درباره گزینه‌های همروندی در زبان برنامه‌نویسی Go است، به بررسی sync.Map می‌پردازد. sync.Map، یک نقشه که برای خواندن و نوشتن همزمان توسط چندین goroutine طراحی شده و نیازی به قفل‌های صریح ندارد، به دلیل ایمنی در برابر همروندی بسیار مفید است. با این حال، Phuong دریافت که sync.Map همیشه گزینه‌ی کاملی نیست. وی در مقاله خود به تجزیه و تحلیل مواردی پرداخته است که استفاده از sync.Map ممکن است مناسب نباشد و به معرفی شرایطی پرداخته که استفاده از روش‌های دیگر گزینه بهتری سازند. این مقاله برای توسعه‌دهندگانی که با محیط همزمان در Go کار می‌کنند و به دنبال راه‌حل‌های ایمن و کارآمد هستند، مفید و آموزنده است.

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


👑 @gopher_academy
🔵 عنوان مقاله
Elevate Your Backend Skills

🟢 خلاصه مقاله:
مقاله به بررسی اهمیت آموزش و توسعه مهارت‌ها در زمینه‌های مختلف برنامه‌نویسی نظیر Python، Go، TypeScript و همچنین آشنایی با پلتفرم‌هایی مانند AWS می‌پردازد. این مقاله تأکید دارد که با استفاده از دوره‌های آموزشی ویدیویی که توسط متخصصین این حوزه‌ها ارائه می‌شود، افراد می‌توانند به طرز چشمگیری دانش و تخصص خود را گسترش دهند. همچنین، اشاره می‌کند به فرصت‌های یادگیری متنوع از طریق مسیرهای یادگیری مختلف که به طور مداوم در حال ارتقا هستند و به شرکت‌کنندگان این امکان را می‌دهد که مهارت‌های مورد نیاز در بازار کار را به دست آورند. این مقاله تاکید می‌کند که توسعه مهارت‌های برنامه‌نویسی در درازمدت می‌تواند به بهبود فرصت‌های شغلی و پیشرفت کاری کمک کند.

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


👑 @gopher_academy
4
🔵 عنوان مقاله
I'm Glad I Did It in Go

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

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


👑 @gopher_academy
🌟هفت آبان روز بزرگذاشت پدر ایران
🌟افتخار ایران و بشریت

🍻#CYRUS_THE_GREAT

👑#کوروش_بزرگ

🕊کوروش بیا که اینجا فرمانده ای نداریم
🕊فرمان بده درفشی از کاویان فرازیم

🕊ما جز قلم نداریم تیغی که صلح آریم
🕊با شعرِ آریایی روحُ روان نوازیم


🍻 به مناسبت این روز تخفیف ۵۰ درصدی روی تعرفه های تبلیغی کانال
🔵فقط 8 و 7 آبان تخفیف ۵۰ درصدی داریم

برای هماهنگی تبلیغات پیام بدید👇
@labdon_ads

👑 @gopher_academy
9❤‍🔥3🎉1😍1👨‍💻1
🔵 عنوان مقاله
Distributed Transactions in Go: Read Before You Try

🟢 خلاصه مقاله:
این مقاله به بررسی و توضیح روش‌های مدیریت تراکنش‌ها در معماری‌های مبتنی بر خدمات می‌پردازد، جایی که این تراکنش‌ها نیاز به پردازش در بیش از یک سرویس دارند. به‌طور خاص، مقاله تمرکز خود را بر روی چالش‌ها و راهکارهای مدیریت و اطمینان از کنسیستنسی داده‌ها در سیستم‌های توزیع‌شده قرار می‌دهد. اول از همه، مقاله مفاهیم پایه‌ای تراکنش و خصوصیات ACID (atomicity, consistency, isolation, durability) را معرفی می‌کند. سپس، به بررسی مدل‌های مختلف تراکنش‌ها مثل 2PC (Two-Phase Commit) و سایر مدل‌های فراگیر تنظیم تراکنش مانند SAGA می‌پردازد. مقاله نیز رهیافت‌های جدید مانند تراکنش‌های طولانی-عمر (Long-running Transactions) و تکنیک‌های بازیابی معاصر را بررسی کرده و تأثیر آن‌ها بر روی مقیاس‌پذیری و دوام سیستم‌ها را تحلیل می‌کند. در نهایت، مقاله توصیه‌ها و بهترین روش‌ها برای طراحی سیستم‌های مقاوم در برابر خطا را ارائه می‌دهد، تاکید بر پیاده‌سازی استراتژی‌هایی که به حفظ تمامیت داده کمک کند.

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


👑 @gopher_academy
1
Forwarded from Bardia & Erfan
طلایی ترین لیست وبلاگ‌ها برنامه نویسان شرکت‌های بزرگ دنیا مثل Google و . . .
در این لیست افرادی که تجربه کار کردن در شرکت‌های بزرگ دارند اسم و لینکشون آورده شده

نفراول :
برنامه نویس شرکت TripAdvisor
هم مقالات فنی و هم مهارت نرم رو پوشش میده
https://dandreamsofcoding.com/

نفر دوم :
خالق الگوریتمی که در تمامی سیستم های recommender در شرکت بزرگ ازش استفاده میشه
https://lemire.me/blog/

نفر سوم :
از ایشون مگه بالاتر داریم ؟ CEO شرکت Stack overflow
https://www.joelonsoftware.com/

نفر چهارم :
مهندس نرمافزار گوگل و خالق چند تا از بزرگترین پروژه‌های Open Source جهان
https://latedev.wordpress.com/

نفر پنجم :
یک از تاثیر گذاران محبوبیت Linux
https://www.linux.org/forums/

نفر ششم :
برنامه نویس Google و نوسینده چند کتاب مشهور در دنیا
https://www.jeremykun.com/

نفر هفتم :
خالق Viaweb نوسینده بزرگ در حیطه برنامه نویسی
https://paulgraham.com/articles.html

نفر هقتم :
متخصص و Director شرکت Huawei
https://www.yegor256.com/

نفر هشتم :
یک متخصص به تمام معنا
https://prog21.dadgum.com/

نفر نهم :
نوسینده کتاب Clean Code
https://blog.cleancoder.com/

نفرم دهم :
مهندس گوگل
https://stevehanov.ca/blog/

نفرم یازدهم :
مهندس شرکت Uber
https://blog.pragmaticengineer.com/


👑 @labdon_academy
3💘1
🔵 عنوان مقاله
Using Go Embed

🟢 خلاصه مقاله:
مقاله توجه را به قابلیت مهمی در زبان برنامه‌نویسی Go با نام `go:embed` معطوف می‌کند که از نسخه 1.16 موجود است. این دستورالعمل امکان ضمیمه کردن فایل‌های استاتیک و حتی پوشه‌های کامل را درون باینری‌ها فراهم می‌کند. به جای ذخیره‌سازی فایل‌ها و دایرکتوری‌های مورد نیاز برنامه به صورت جداگانه، `go:embed` این امکان را می‌دهد که محتویات مورد نظر را مستقیماً درون ساختار (`struct`) خود برنامه ضمیمه کنید.

با استفاده از این قابلیت، برنامه‌نویسان می‌توانند از کاراکترهای وایلدکارد برای اضافه کردن فایل‌ها استفاده کنند و به تعبیه مستقیم دایرکتوری‌ها در اپلیکیشن پردازند، که در نتیجه مدیریت فایل‌ها را ساده‌تر می‌کند و بهینگی برنامه را افزایش می‌دهد. این رویکرد می‌تواند به خصوص برای توزیع نرم‌افزارهای تحت وب و اپلیکیشن‌های مبتنی بر GUI که نیازمند منابع خارجی همچون تصاویر، قالب‌ها و فایل‌های سبک هستند، مفید واقع شود.

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


👑 @gopher_academy
4
✍️Amir NiloofariAmir Niloofari

آشنایی با Garbage Collector در Go
: مدیریت حافظه کارآمد برای نرم‌افزار‌ها با کارایی بالا - قسمت ۱
همانطور که در پست قبل اشاره شد یکی از تمایزهای کلیدی Go، جمع آوری زباله همزمان(Concurrent Garbage collector) آن است که به طور هدفمند برای محیط های ابری و سرور‌های مدرن ساخته شده است.
با Go، توسعه‌دهندگان می‌توانند برنامه‌هایی با کارایی بالا بسازند و در عین حال مدیریت حافظه را به یک جمع‌آوری زباله بسیار بهینه و کم تأخیر بسپارند.
در این پست قرار است نگاهی عمیق‌تر به دلیل متمایز شدن Go’s GC و نحوه عملکرد آن بیندازیم:

- الگوریتم Mark-and-Sweep همزمان:
Go از فرآیند جمع‌آوری زباله Mark-and-Sweep استفاده می‌کند که همزمان با برنامه اجرا می‌شود. در مرحله Mark، لایو آبجکت‌ها (آبجکتی که حداقل یک مرجع به آن وجود دارد) شناسایی و علامت گذاری می شوند. سپس در مرحله Sweep حافظه را برای آبجکت‌هایی که دیگر به آنها ارجاع داده نمی شود اختصاص می دهد. زیبایی این فرآیند این است که به موازات اجرای برنامه اتفاق می‌افتد که برای ساخت برنامه‌های حساس به عملکرد مانند سرورهای وب یا سیستم‌های توزیع شده که در آن وقفه‌ها می‌توانند مستقیماً بر تاخیر (latency) تاثیر بگذارند، بسیار مهم است.

- تأخیر کم:
GC Go برای سناریوهای Low latency بهینه شده است که این برای برنامه هایی که نیاز به زمان پاسخ سریع دارند، مانند سیستم های بلادرنگ یا API هایی که حجم زیادی از ترافیک را مدیریت می کنند، ایده آل است. جمع‌آوری زباله به گونه‌ای طراحی شده است که مکث‌ها را به حداقل می‌رساند و حجم کاری خود را در چندین هسته CPU توزیع می‌کند و عملکرد برنامه را صاف و بدون وقفه نگه می‌دارد.

- الگوریتم علامت گذاری سه رنگ(Tricolor Marking):
اگر بخواهیم پشت پرده عملکرد زبان گو در مدیریت آبجکت‌ها را ببینیم از الگوریتم علامت گذاری سه رنگ برای مدیریت کارآمد چرخه عمر اشیا استفاده می کند.
آبجکت‌ها به عنوان سفید (غیرقابل دسترسی)، خاکستری (قابل دسترسی اما به طور کامل کاوش نشده)، یا سیاه (کاملا قابل دسترسی و کاوش شده) طبقه بندی می شوند. این رویکرد تضمین می‌کند که آبجکت‌ها زنده به درستی علامت‌گذاری می‌شوند، در حالی که آبجکت‌ها غیرقابل دسترس کنار گذاشته می‌شوند، حفظ حافظه غیر ضروری را کاهش می‌دهد و استفاده کارآمدتر از حافظه را تضمین می‌کند.

- نوشتن موانع برای اصلاحات حافظه ایمن:
Go در مرحله علامت‌گذاری از write barriers استفاده می‌کند تا هنگام تغییر آبجکت‌ها در حافظه، دقت را حفظ کند.
این موانع به‌عنوان نقاط بازرسی عمل می‌کنند و اطمینان می‌دهند که جمع‌آورنده زباله از تغییرات در ارجاعات آبجکت‌ها حتی زمانی که برنامه هنوز در حال اجرا است، آگاه است.
این مکانیسم از Memory corruption جلوگیری می کند (هنگامی که محتویات یک مکان حافظه به دلیل رفتار برنامه‌ای که از قصد برنامه‌نویس اصلی یا سازه‌های برنامه/زبان فراتر می‌رود، تغییر می‌کند.) و تضمین می کند که آبجکت‌ها زنده به اشتباه جابجا نمی شوند و کل سیستم را انعطاف پذیرتر و پاسخگوتر می کند.

👑 @gopher_academy
🙏1💘1
Gopher Academy
✍️Amir NiloofariAmir Niloofari آشنایی با Garbage Collector در Go : مدیریت حافظه کارآمد برای نرم‌افزار‌ها با کارایی بالا - قسمت ۱ همانطور که در پست قبل اشاره شد یکی از تمایزهای کلیدی Go، جمع آوری زباله همزمان(Concurrent Garbage collector) آن است که به طور…
آشنایی با Garbage Collector در Go: مدیریت حافظه کارآمد برای نرم‌افزار‌ها با کارایی بالا - قسمت ۲

میتوانید قسمت ۱ را در پست قبلی مطالعه کنید. ادامه:
- جمع آوری زباله قابل تنظیم:
یکی از ویژگی های برجسته Go، جمع آوری زباله قابل تنظیم آن است. توسعه‌دهندگان می‌توانند فرکانس GC را با استفاده از متغیر محیطی «GOGC» تنظیم کنند، که تعداد دفعات کار جمع‌آور زباله را نسبت به رشد پشته کنترل می‌کند.
مقدار پیش فرض 100 است، به این معنی که GC پس از دو برابر شدن اندازه پشته فعال می شود. افزایش مقدار «GOGC» فرکانس جمع‌آوری زباله را کاهش می‌دهد، مصرف حافظه را با وقفه‌های کمتر عوض می‌کند، در حالی که کاهش آن باعث می‌شود GC بیشتر اجرا شود و کنترل دقیق‌تری بر استفاده از حافظه تضمین می‌کند.

export GOGC=200 // رشد پشته را افزایش می دهد و باعث می شود GC کمتر اجرا شود

- Escape Analysis برای تخصیص پشته در مقابل هیپ:
کامپایلر Go از تحلیل گریز استفاده می‌کند، که تعیین می‌کند متغیرها می‌توانند در کدام ساختار داده stack یا heap تخصیص داده شوند. متغیرهایی که از محدوده خود "فرار" نمی کنند (مانند متغیرهای محلی در یک تابع) به صورت پشته ای تخصیص داده می شوند که سریعتر است و از جمع آوری زباله به طور کلی جلوگیری می کند. از سوی دیگر، تخصیص هیپ توسط جمع کننده زباله ردیابی می شود و تحلیل فرار استفاده غیر ضروری از هیپ را به حداقل می رساند و مدیریت حافظه را برای بسیاری از برنامه ها بهینه می کند.

- Profiling and Monitoring عملکرد GC:
Go ابزارهای قوی برای نظارت و بهینه سازی عملکرد GC فراهم می کند. بسته «زمان اجرا» به توسعه دهندگان اجازه می دهد تا آمار دقیق GC را ردیابی کنند، در حالی که "pprof" پروفایل CPU و حافظه را برای شناسایی و رفع تنگناهای عملکرد ارائه می دهد. این به ویژه برای برنامه‌هایی با تنظیمات دقیق که نیاز به کار در مقیاس یا زیر بار سنگین دارند، ارزشمند است و این امکان را می‌دهد الگوهای استفاده از حافظه را مشخص کرد و رفتار برنامه را بهینه نمود.

- کارایی حافظه در Go:
ترکیبی از جمع‌آوری همزمان زباله، Escape Analysis و موانع نوشتن تضمین می‌کند که Go در مدیریت حافظه بسیار کارآمد است، و آن را به یک انتخاب قدرتمند برای سیستم‌های بک‌اند، میکروسرویس‌ها و سرورهای با توان بالا تبدیل می‌کند.
چه در حال ساخت یک برنامه بومی ابری یا یک API با کارایی بالا باشید، GC به شما آرامش می دهد که مدیریت حافظه بدون نیاز به مداخله دستی بهینه شده است.

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


👑 @gopher_academy
🔥1💯1
کلیدی‌ترین تفاوت‌های بین context.WithTimeout و context.WithDeadline در نحوه‌ی مدیریت زمان‌بندی و خاتمه‌ی contextها در Go است:

### 1. مبنای زمان‌بندی
- **context.WithTimeout**:
یک بازه زمانی ثابت مشخص می‌کند. Context پس از گذشت مدت زمان مشخص از زمان فراخوانی این تابع، منقضی می‌شود.
- مثال: اگر context.WithTimeout(ctx, 5*time.Second) فراخوانی شود، context پس از ۵ ثانیه منقضی می‌شود.
- **context.WithDeadline**:
یک زمان مشخص در آینده تعیین می‌کند. Context دقیقا در لحظه‌ی مشخص شده در deadline منقضی می‌شود.
- مثال: اگر context.WithDeadline(ctx, time.Now().Add(5*time.Second)) فراخوانی شود، context در لحظه‌ی دقیق مشخص شده (۵ ثانیه بعد) منقضی می‌شود.
مورد استفادهستفاده**
- **WithTimeout**:
زمانی که مدت زمان اجرای یک عملیات برای شما مهم است و می‌خواهید پس از مدت مشخصی عملیات خاتمه یابد، از WithTimeout استفاده می‌شود.
- **WithDeadline**:
زمانی که به یک deadline دقیق نیاز دارید (مانند زمانی که می‌خواهید قبل از یک لحظه‌ی دقیق، عملیاتی خاتمه یابد)، از WithDeadline استفاده پیاده‌سازی داخWithTimeout **WithTimeout** به عنوان یک shortcut برای WithDeadline عمل می‌کند و در واقع از WithDeadline استفاده می‌کند تا زمانی که مدت مشخص شده به پایان برسد. به این معنا که WithTimeout(ctx, d) معادل WithDeadline(ctx, time.Now().Add(d)) است.

### 4. **انعطاف‌پذیری بیشتر WithDeadline**
- در مواردی که زمان دقیق (مربوط به یک deadline خاص) برای شما مهم است، WithDeadline انعطاف بیشتری فراهم می‌کند، زیرا می‌توانید زمان مشخصی را به عنوان نقطکاربردهای رایج. **کاربردهای رایج**
- **context.WithTimeout** معمولاً برای تعیین یک بازه زمانی ثابت برای خاتمه دادن به عملیاتی مانند درcontext.WithDeadline**context.WithDeadline** اغلب در سیستم‌های توزیع شده یا عملیاتی که یک زمان‌بندی خاص برای اتمام دارند، کاربرد دارد.

### مثال‌ها:
// WithTimeout: منقضی شدن پس از 5 ثانیه
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

// WithDeadline: منقضی شدن در یک زمان دقیق
ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(5*time.Second))
defer cancel()

در نهایت، انتخاب بین این دو تابع بستگی به نوع نیاز شما به زمان‌بندی و مدیریت زمان اجرای عملیات‌ها دارد.



👑 @gopher_academy
🎉21
Gopher Academy
کلیدی‌ترین تفاوت‌های بین context.WithTimeout و context.WithDeadline در نحوه‌ی مدیریت زمان‌بندی و خاتمه‌ی contextها در Go است: ### 1. مبنای زمان‌بندی - **context.WithTimeout**: یک بازه زمانی ثابت مشخص می‌کند. Context پس از گذشت مدت زمان مشخص از زمان فراخوانی…
برای درک بهتر از مکانیزم داخلی context.WithTimeout و context.WithDeadline، باید به نحوه‌ی پیاده‌سازی آن‌ها در کتابخانه‌ی context و چگونگی استفاده از تایمرها در Go توجه کنیم.


این دو تابع هر دو بر اساس context پایه‌ای ساخته می‌شوند، اما تفاوت اصلی آن‌ها در نحوه‌ی مدیریت زمان و استفاده از تایمرهای داخلی است.

### 1. ساختار Context
هر دو WithTimeout و WithDeadline با ایجاد یک derived context (مشتق‌شده از context اصلی) کار می‌کنند. این context جدید مشابه context اصلی است، اما به جای آن که تا انتهای عمر برنامه معتبر باشد، در یک زمان مشخص منقضی می‌شود. مکانیزم داخلی به این صورت است:

- **WithTimeout**:
این تابع مدت زمانی به عنوان ورودی می‌گیرد و به کمک آن یک تایمر تنظیم می‌کند. تایمر از زمان فعلی (time.Now()) شروع به شمارش می‌کند و بعد از اتمام مدت زمان مشخص شده، context منقضی می‌شود.
- تایمر در واقع یک goroutine راه‌اندازی می‌کند که بعد از گذشت زمان، یک سیگنال خاتمه (Done) ارسال می‌کند.

- **WithDeadline**:
مشابه WithTimeout است، اما به جای این که مدت زمان از حالا محاسبه شود، زمانی ثابت برای خاتمه داده می‌شود. Goroutine مشابهی برای زمان دقیق پایان شروع می‌شود. این تابع می‌تواند مفید باشد در مواقعی که باید عملیات حتماً قبل از یک زمان خاص خاتمه یابد.
مکانیزم استفاده از تایمرهاایمرها**
در هر دو روش، تایمرها با استفاده از time.AfterFunc یا time.NewTimer در Go پیاده‌سازی می‌شوند. تایمر به‌گونه‌ای عمل می‌کند که وقتی زمان مشخص شده به پایان برسد، کانال Done فعال شده و پیام خاتمه ارسال می‌شود. در این زمان، عملیات مرتبط باید متوقف شود و با بررسی کانال Done از ادامه‌ی کار بازماند.
نحوه‌ی لغو Contextontext**
هر دو تابع به همراه یک تابع cancel بازگردانده می‌شوند. این تابع cancel به شما اجازه می‌دهد به صورت دستی context را قبل از پایان زمان آن لغو کنید. وقتی cancel فراخوانی شود، تایمر مربوط به context متوقف شده و کانال Done نیز بسته می‌شود. این مکانیزم به شما کمک می‌کند تا منابع استفاده‌شده توسط تایمرها را پاک‌سازی کنید و از اجرای بی‌مورد جلوگیری نمایید.
نحوه‌ی بررسی انقضای Contextontext**
هنگامی که عملیات در جریان است، شما می‌توانید با استفاده از ctx.Done() بررسی کنید که آیا context منقضی شده یا خیر. این تابع یک کانال بازمی‌گرداند که در صورت انقضای context، بسته می‌شود و به goroutine‌ها سیگنال می‌دهد که عملیات فعلی را خاتمه دهند. این سیگنال‌دهی از طریق select یا بررسی مستقیم کانال انجام می‌شود.

### 5. **پیاده‌سازی داخلی WithTimeout به کمک WithDeadline**
در کد داخلی کتابخانه context، پیاده‌سازی WithTimeout به صورت مستقیم از WithDeadline استفاده می‌کند:

func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc) {
return WithDeadline(parent, time.Now().Add(timeout))
}

این تابع فقط زمان حال (time.Now()) را به timeout اضافه کرده و آن را به WithDeadline ارسال می‌کند. به همین دلیل، WithTimeout در واقع یک shortcut برای WithDeadline است.

### 6. **زمان‌بندی دقیق‌تر با WithDeadline**
در WithDeadline شما می‌توانید یک زمان دقیق برای انقضا مشخص کنید. مثلاً می‌توانید تعیین کنید که context در ساعت مشخصی منقضی شود، بدون توجه به این که در حال حاضر چقدر زمان باقی‌مانده است. این ویژگی برای مواردی مفید است که نیاز دارید چندین عملیات به طور همزمان و هماهنگ با یک deadline خاص به پایان برسند.

### نتیجه‌گیری:
- WithTimeout برای محدود کردن مدت زمان یک عملیات مفید است.
- WithDeadline برای تعیین یک زمان دقیق (مانند یک deadline واقعی) استفاده می‌شود.
- هر دو تابع مکانیزم‌های مشابهی از تایمرهای Go استفاده می‌کنند و هر دو به کمک goroutine‌ها برای ارسال سیگنال خاتمه عمل می‌کنند.


👑 @gopher_academy
👍21🎉1
Forwarded from Bardia & Erfan
تأثیر دانش زبان انگلیسی در دنیای برنامه‌نویسی از نگاه موسسه زبان آفاق

https://www.zoomit.ir/pr/428701-afagh-lc/


👑 @labdon_academy
🎉1🍓1👻1
🔵 عنوان مقاله
Product for Engineers: A Newsletter Helping Flex Your Product Muscle

🟢 خلاصه مقاله:
مقاله "Product for Engineers" به بررسی مهارت‌ها و استراتژی‌های لازم برای مهندسین محصول می‌پردازد تا آن‌ها در حرفه‌شان موفق شوند. در این مقاله، اهمیت ترکیب مهارت‌های فنی با دانش مدیریت محصول تأکید شده است. مهندسین محصول باید نه تنها در فناوری‌های مربوطه مهارت داشته باشند، بلکه باید قادر به درک نیازهای بازار و توسعه راه حل‌های متناسب با این نیازها نیز باشند. مقاله همچنین بر اهمیت توانایی کار در تیم‌های متقاطع و ارتباط موثر با سایر بخش‌های شرکت، از جمله بازاریابی و فروش، تأکید می‌کند. نویسنده به مهندسین محصول توصیه می‌کند که برای موفقیت در نقش‌های مدیریتی، باید مهارت‌های رهبری و تصمیم‌گیری را نیز توسعه دهند. به‌طور خلاصه، هدف اصلی مقاله تقویت درک مهندسین محصول از اصول اساسی مدیریت محصول و توسعه مهارت‌های کلیدی مورد نیاز برای پیشرفت در این حرفه است.

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


👑 @gopher_academy
👍1
🔵 عنوان مقاله
Go Gets High-Resolution Timers on Windows

🟢 خلاصه مقاله:
در این مقاله به بررسی پشتیبانی افزوده شده برای تایمرهای با وضوح بالا در نسخه 1.23 زبان برنامه‌نویسی Go بر روی سیستم‌عامل ویندوز پرداخته شده است. در نسخه‌های پیشین، وضوح تایمرها در حدود 15.6 میلی‌ثانیه بود، اما با به‌روزرسانی‌های جدید، این وضوح به تقریباً 0.5 میلی‌ثانیه افزایش یافته است. این بهبود قابل توجه، امکان دقت بیشتری را در زمان‌بندی عملیات و به خصوص در برنامه‌هایی که نیازمند پردازش زمانی دقیق هستند، فراهم می‌کند. این تغییر می‌تواند تاثیرات مهمی در بهبود عملکرد کلی برنامه‌های نوشته شده به زبان Go داشته باشد، به ویژه در محیط‌هایی که پاسخگویی سریع الزامی است.

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


👑 @gopher_academy
👍1🔥1
✍️Farshad AkbariFarshad Akbari



💡 آشنایی با کتابخانه sync در Go و کاربردهای آن برای مدیریت همزمانی

در برنامه‌نویسی Go، وقتی چند گوروتین همزمان اجرا می‌شوند، مدیریت همزمانی و دسترسی به منابع مشترک اهمیت زیادی پیدا می‌کند. کتابخانه sync در Go ابزارهایی فراهم می‌کند که به توسعه‌دهندگان کمک می‌کند تا این مدیریت را به سادگی و بدون بروز خطا انجام دهند. در ادامه به سه ابزار اصلی این کتابخانه اشاره می‌کنم:

1️⃣ Mutex (قفل متقابل)

Mutex برای جلوگیری از دسترسی همزمان گوروتین‌ها به یک منبع مشترک استفاده می‌شود. مثلا اگر چند گوروتین بخواهند به طور همزمان یک متغیر را تغییر دهند، با استفاده از Mutex می‌توانیم قفل دسترسی به این منبع را به یک گوروتین محدود کنیم.

2️⃣ WaitGroup (انتظار برای پایان گوروتین‌ها)

وقتی چند گوروتین همزمان اجرا می‌شوند و می‌خواهیم تا پایان کار همه‌ی آن‌ها صبر کنیم، WaitGroup کاربرد دارد. این ابزار به ما اجازه می‌دهد که منتظر بمانیم تا همه گوروتین‌ها کارشان را تمام کنند.

3️⃣ Once (اجرا فقط یک‌بار)

با استفاده از Once، می‌توانیم اطمینان حاصل کنیم که یک تابع فقط یک بار اجرا شود، حتی اگر چند گوروتین به طور همزمان آن را صدا بزنند. این ابزار برای مواردی مثل مقداردهی اولیه بسیار کاربردی است.


🔍 جمع‌بندی

کتابخانه sync به توسعه‌دهندگان Go کمک می‌کند تا همزمانی را به خوبی مدیریت کنند و از بروز مشکلاتی مثل شرایط رقابتی جلوگیری کنند. استفاده درست از این ابزارها باعث افزایش کارایی و ایمنی برنامه‌های چندوظیفه‌ای می‌شود.

👑 @gopher_academy
5👍1
🔵 عنوان مقاله
Writing a Circuit Breaker in Go

🟢 خلاصه مقاله:
این مقاله به بررسی سازوکار Circuit Breaker در مدیریت خطاها در سیستم‌های محاسباتی می‌پردازد. Circuit Breaker یک روش موثر برای جلوگیری از تکرار اشتباهاتی است که ممکن است به صورت پیوسته رخ دهند و باعث تشدید مشکلات سیستم شوند. این سازوکار، شبیه به کلید برق در ساختمان عمل می‌کند؛ در صورت بروز خطا به طور خودکار عملیات مورد نظر را قطع می‌کند تا از آسیب‌های بیشتر جلوگیری کند و با یک دوره زمانی تعیین شده به نام دوره خنک شدن، به سیستم این امکان را می‌دهد تا بازیابی کند. این رویکرد به کاهش آسیب‌پذیری سیستم کمک کرده و به بهبود ثبات و کارایی آن در برابر شکست‌های احتمالی منجر می‌شود. این تکنیک، به ویژه در محیط‌هایی که دارای وابستگی‌های متعدد و پیچیده هستند، حائز اهمیت است.

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


👑 @gopher_academy
🔵 عنوان مقاله
Sidekick: Bare Metal to Production Ready in Minutes

🟢 خلاصه مقاله:
مقاله‌ای که بررسی شده به معرفی ابزار جدیدی به نام "Sidekick" می‌پردازد که با الهام از "Kamal" ساخته شده و به زبان برنامه‌نویسی Go نوشته شده است. هدف اصلی Sidekick این است که فرآیند استقرار نرم‌افزارها را بر روی سرورهای خصوصی به صورتی ساده و با استفاده از تنها یک دستور، مشابه به سرویس Fly.io، فراهم آورد. نویسنده مقاله هنوز فرصتی برای امتحان این ابزار نداشته‌ است اما علاقه‌مند است که به زودی آن را بیازماید. از انجا که Sidekick بر اساس تجربیات و مفاهیم مشابه به Kamal طراحی شده، این ابزار می‌تواند راه‌حلی نوین و قدرتمند برای توسعه‌دهندگان و متخصصان IT در بهبود و تسهیل روند استقرار و مدیریت برنامه‌ها بر روی وی‌پی‌اس‌ها باشد.

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


👑 @gopher_academy
🔥1
🔵 عنوان مقاله
Kamal 2: Thou Need Not PaaS

🟢 خلاصه مقاله:
مقاله به بررسی ابزار استقرار بر اساس کانتینر به نام Kamal از شرکت 37Signals می‌پردازد، شرکتی که بیشتر به خاطر توسعه Ruby on Rails شناخته شده است. اگرچه Kamal زبان‌ناپذیر است و از زبان‌های برنامه‌نویسی مختلف پشتیبانی می‌کند. این مقاله به توضیح و نمایش استقرار یک برنامه ساده به زبان Go با استفاده از یک دموی اسکرین‌کست می‌پردازد و سپس به مثالی با زبان Ruby می‌رسد. Kamal به عنوان یک گزینه جدید و قابل اعتماد برای استقرار برنامه‌های Go در سرورهای مدیریت‌ شده توسط خود معرفی شده است که می‌تواند راه برای استفاده گسترده‌تر از آن را هموار سازد. ابزار مذکور می‌تواند تحولی در استقرار سریع و آسان نرم‌افزارها بر روی پلتفرم‌های مختلف به ارمغان بیاورد.

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


👑 @gopher_academy
👍1
🔵 عنوان مقاله
go-pretty: Pretty Print Tables, Lists and Text on the Terminal

🟢 خلاصه مقاله:
مقاله‌ای که در اختیار شما قرار دارد به بررسی ابزارهای مختلفی می‌پردازد که به زیباسازی خروجی کنسول در قالب جداول، لیست‌ها، نوارهای پیشرفت، متن و غیره می‌پردازند. تمرکز اصلی این ابزارها بر روی قابلیت سفارشی‌سازی است. این سفارشی‌سازی به کاربران امکان می‌دهد تا ظاهر خروجی‌ها را بر اساس نیازها و سلایق شخصی خود تنظیم کنند. از جمله مزایای استفاده از این ابزارها، بهبود خوانایی و جذابیت ویژوال خروجی‌های کنسولی است، که می‌تواند در فهم بهتر و سریع‌تر داده‌ها به کاربران کمک کند. این ابزارها، به خصوص در محیط‌های توسعه نرم‌افزار و آنالیز داده، کاربردی ارزشمند دارند. این مقاله با ارائه مثال‌های متنوع، نحوه به کارگیری و پیاده‌سازی این ابزارها را با جزئیات و به صورت گام به گام توضیح می‌دهد.

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


👑 @gopher_academy
👍1