ru
Feedback

Не попадитесь на канал ботавода! Telemetrio находит и помечает такие каналы 👉 Хотите видеть метку — оформите подписку

Gopher Academy

Gopher Academy

Открыть в Telegram
3 867
Подписчики
+224 часа
+47 дней
+3030 дней
Привлечение подписчиков
окт. '26
октябрь '26
+36
в 0 каналах
сентябрь '26
+69
в 6 каналах
Get PRO
август '26
+69
в 4 каналах
Get PRO
июль '26
+58
в 0 каналах
Get PRO
июнь '26
+67
в 0 каналах
Get PRO
май '26
+45
в 0 каналах
Get PRO
апрель '26
+24
в 5 каналах
Get PRO
март '26
+10
в 0 каналах
Get PRO
февраль '26
+79
в 1 каналах
Get PRO
январь '26
+29
в 8 каналах
Get PRO
декабрь '25
+103
в 7 каналах
Get PRO
ноябрь '25
+72
в 1 каналах
Get PRO
октябрь '25
+598
в 1 каналах
Get PRO
сентябрь '25
+61
в 6 каналах
Get PRO
август '25
+84
в 9 каналах
Get PRO
июль '25
+99
в 10 каналах
Get PRO
июнь '25
+47
в 7 каналах
Get PRO
май '25
+45
в 1 каналах
Get PRO
апрель '25
+63
в 8 каналах
Get PRO
март '25
+90
в 8 каналах
Get PRO
февраль '25
+91
в 3 каналах
Get PRO
январь '25
+96
в 3 каналах
Get PRO
декабрь '24
+113
в 7 каналах
Get PRO
ноябрь '24
+94
в 2 каналах
Get PRO
октябрь '24
+116
в 4 каналах
Get PRO
сентябрь '24
+138
в 4 каналах
Get PRO
август '24
+101
в 2 каналах
Get PRO
июль '24
+187
в 5 каналах
Get PRO
июнь '24
+173
в 11 каналах
Get PRO
май '24
+301
в 2 каналах
Get PRO
апрель '24
+185
в 3 каналах
Get PRO
март '24
+172
в 3 каналах
Get PRO
февраль '24
+154
в 0 каналах
Get PRO
январь '24
+207
в 0 каналах
Get PRO
декабрь '23
+215
в 4 каналах
Get PRO
ноябрь '23
+77
в 2 каналах
Get PRO
октябрь '23
+79
в 0 каналах
Get PRO
сентябрь '23
+70
в 0 каналах
Get PRO
август '23
+108
в 0 каналах
Get PRO
июль '23
+68
в 0 каналах
Get PRO
июнь '23
+106
в 0 каналах
Get PRO
май '23
+211
в 0 каналах
Get PRO
апрель '23
+142
в 0 каналах
Get PRO
март '23
+56
в 0 каналах
Get PRO
февраль '23
+70
в 0 каналах
Get PRO
январь '23
+62
в 0 каналах
Get PRO
декабрь '22
+14
в 0 каналах
Get PRO
ноябрь '22
+24
в 0 каналах
Get PRO
октябрь '22
+15
в 0 каналах
Get PRO
сентябрь '22
+78
в 0 каналах
Get PRO
август '22
+47
в 0 каналах
Get PRO
июль '22
+36
в 0 каналах
Get PRO
июнь '22
+26
в 0 каналах
Get PRO
май '22
+27
в 0 каналах
Get PRO
апрель '22
+14
в 0 каналах
Get PRO
март '22
+21
в 0 каналах
Get PRO
февраль '22
+13
в 0 каналах
Get PRO
январь '22
+24
в 0 каналах
Get PRO
декабрь '21
+51
в 0 каналах
Get PRO
ноябрь '21
+107
в 0 каналах
Get PRO
октябрь '21
+13
в 0 каналах
Get PRO
сентябрь '21
+31
в 0 каналах
Get PRO
август '21
+29
в 0 каналах
Get PRO
июль '21
+41
в 0 каналах
Get PRO
июнь '21
+29
в 0 каналах
Get PRO
май '21
+26
в 0 каналах
Get PRO
апрель '21
+49
в 0 каналах
Get PRO
март '21
+376
в 0 каналах
Дата
Привлечение подписчиков
Упоминания
Каналы
17 октября+2
16 октября+3
15 октября+1
14 октября+1
13 октября+3
12 октября+2
11 октября+3
10 октября+1
09 октября+4
08 октября+6
07 октября0
06 октября+2
05 октября+1
04 октября+2
03 октября+2
02 октября0
01 октября+3
Посты канала
جمع‌بندی نهایی برای انتخاب سریع در پروژه Go از این قانون استفاده کن: فقط خواندن داده مشترک: RLock() و RUnlock() با RWMutex تغییر داده مشترک: Lock() و Unlock() داده‌ای که خواندن و نوشتن هر دو باید کاملاً انحصاری باشند: Mutex ساده داده‌ای با خواندن زیاد و نوشتن کم: بررسی RWMutex و اندازه‌گیری عملکرد یک نکته مهم: هیچ‌وقت RUnlock() را برای آزادکردن Lock() یا Unlock() را برای آزادکردن RLock() به کار نبر؛ هر قفل باید با متد متناظر خودش آزاد شود

2
مثال ۳: استفاده از هر چهار متد در یک Cache واقعی فرض کن یک API اطلاعات محصولات را در حافظه نگه می‌دارد. خواندن اطلاعات زیاد اتفاق می‌افتد، اما به‌روزرسانی محصولات کمتر است. اینجا sync.RWMutex کاربرد دارد. package main import ( "fmt" "sync" ) type ProductCache struct { mu sync.RWMutex products map[int]string } func (c *ProductCache) Get(id int) string { c.mu.RLock() defer c.mu.RUnlock() return c.products[id] } func (c *ProductCache) Set(id int, name string) { c.mu.Lock() defer c.mu.Unlock() c.products[id] = name } func main() { cache := ProductCache{ products: map[int]string{ 1: "Laptop", }, } var wg sync.WaitGroup for i := 0; i < 3; i++ { wg.Add(1) go func() { defer wg.Done() fmt.Println("Product:", cache.Get(1)) }() } wg.Add(1) go func() { defer wg.Done() cache.Set(1, "Gaming Laptop") }() wg.Wait() fmt.Println("Final:", cache.Get(1)) } در این مثال: متد | کاربرد واقعی RLock() | قبل از خواندن محصول از Cache RUnlock() | پس از پایان خواندن محصول Lock() | قبل از اضافه‌کردن یا تغییر محصول Unlock() | پس از پایان تغییر محصول ترتیب اجرای Goroutineها تضمین‌شده نیست؛ بنابراین ممکن است خواندن‌ها نام محصول قبلی یا جدید را نشان دهند. اما دسترسی هم‌زمان به map به شکل ایمن محافظت می‌شود.
212
3
مثال ۲: Lock() و Unlock() — تغییر موجودی حساب فرض کن یک حساب بانکی داریم و چند درخواست هم‌زمان می‌خواهند به موجودی آن پول اضافه کنند. ا گر قفل نداشته باشیم، ممکن است به دلیل رقابت هم‌زمان (Race Condition)، بعضی تغییرات از بین بروند. package main import ( "fmt" "sync" ) type BankAccount struct { mu sync.Mutex balance int } func (a *BankAccount) Deposit(amount int) { a.mu.Lock() defer a.mu.Unlock() a.balance += amount } func (a *BankAccount) Balance() int { a.mu.Lock() defer a.mu.Unlock() return a.balance } func main() { account := &BankAccount{} var wg sync.WaitGroup for i := 0; i < 1000; i++ { wg.Add(1) go func() { defer wg.Done() account.Deposit(10) }() } wg.Wait() fmt.Println("Balance:", account.Balance()) } خروجی: Balance: 10000 چرا از Lock() و Unlock() استفاده کردیم؟ ا Lock() تضمین می‌کند در هر لحظه فقط یک Goroutine موجودی را تغییر دهد. اUnlock() پس از پایان تغییر، قفل را آزاد می‌کند. اdefer کمک می‌کند قفل حتی هنگام خروج زودهنگام از تابع آزاد شود. در این مثال از sync.Mutex استفاده کردیم، چون عملیات واریز نیازمند دسترسی انحصاری است.
162
4
بیایم با مثال‌های واقعی تفاوت این چهار متد را بررسی کنیم؛ طوری که مشخص شود در پروژه‌های واقعی، مثل مدیریت کاربران، موجودی حساب و کش (Cache)، چه زمانی از هرکدام استفاده می‌کنیم. مثال ۱: RLock() و RUnlock() — خواندن اطلاعات کاربران فرض کن یک سرویس داریم که اطلاعات کاربران را نگه می‌دارد. چندین درخواست می‌توانند هم‌زمان اطلاعات یک کاربر را بخوانند، بدون اینکه داده را تغییر دهند. package main import ( "fmt" "sync" ) type UserStore struct { mu sync.RWMutex users map[int]string } func (s *UserStore) GetUser(id int) string { s.mu.RLock() defer s.mu.RUnlock() return s.users[id] } func main() { store := UserStore{ users: map[int]string{ 1: "labdon", 2: "bardia", }, } var wg sync.WaitGroup for i := 0; i < 3; i++ { wg.Add(1) go func() { defer wg.Done() fmt.Println(store.GetUser(1)) }() } wg.Wait() } در عمل چه اتفاقی می‌افتد؟ سه Goroutine اطلاعات کاربر را درخواست می‌کنند. هر سه می‌توانند هم‌زمان RLock() بگیرند. هیچ‌کدام اطلاعات را تغییر نمی‌دهند. بعد از خواندن، هرکدام با RUnlock() قفل خواندن خود را آزاد می‌کند. خروجی: labdon labdon labdon
131
5
تفاوت sync.Mutex و sync.RWMutex sync.Mutex فقط دو متد اصلی دارد: Lock() و Unlock(). هر بار تنها یک Goroutine می‌تواند قفل را در اختیار داشته باشد؛ حتی اگر فقط قصد خواندن داده را داشته باشد. sync.RWMutex علاوه بر Lock() و Unlock()، متدهای RLock() و RUnlock() را نیز دارد. امکان خواندن هم‌زمان چند Goroutine را فراهم می‌کند؛ اما نوشتن به قفل انحصاری نیاز دارد. چه زمانی از کدام استفاده کنیم؟ اگر داده هم خوانده می‌شود و هم تغییر می‌کند و چند Goroutine به آن دسترسی دارند، از قفل مناسب استفاده کن. اگر تعداد خواندن‌ها زیاد و تعداد نوشتن‌ها کم است، RWMutex می‌تواند مفید باشد. اگر عملیات کوتاه است یا رقابت روی قفل کم است، Mutex ساده‌تر است و ممکن است عملکرد بهتری داشته باشد. اگر داده فقط توسط یک Goroutine استفاده می‌شود، معمولاً نیازی به Mutex نیست. نکته پیشرفته: در RWMutex، وقتی یک Writer منتظر گرفتن Lock() باشد، Readerهای جدید اجازه ورود ندارند تا Writerها برای همیشه پشت جریان مداوم Readerها نمانند. همچنین نباید هنگام داشتن RLock، دوباره RLock گرفت و فرض کرد همیشه بدون مشکل کار می‌کند؛ وجود Writer منتظر می‌تواند باعث بن‌بست شود. جمع‌بندی: ا RLock یعنی اجازه خواندن مشترک. ا RUnlock یعنی پایان دسترسی خواندن. ا Lock یعنی گرفتن قفل انحصاری برای خواندن یا نوشتن محافظت‌شده. ا Unlock یعنی آزاد کردن قفل انحصاری. قاعده کاربردی: خواندن با RLock/RUnlock و تغییر داده با Lock/Unlock؛ البته فقط وقتی از RWMutex استفاده می‌کنی.
174
6
🔵 عنوان مقاله Don't Couple Your Go Code to GitHub 🟢 خلاصه مقاله: در دنیای برنامه‌نویسی با زبان Go، یکی از مواردی که ممکن است سوال‌برانگیز باشد، استفاده مستقیم از آدرس‌های گیت‌هاب در مسیرهای وارداتی است. بسیاری بر این باورند که قرار دادن آدرس «github.com» در مسیرهای import، می‌تواند مشکلاتی را در آینده برای توسعه‌دهندگان ایجاد کند، از جمله وابستگی بیش‌ازحد به یک سرویس خاص و کاهش انعطاف‌پذیری پروژه‌ها. ایان، توسعه‌دهنده‌ای باتجربه، عقیده دارد بهتر است به جای استفاده مستقیم از دامنه گیت‌هاب، از دامنه شخصی یا سازمانی خود بهره‌برداری کنید. این راهکار نه تنها باعث حفظ استقلال پروژه می‌شود، بلکه در مواردی که نیاز به مهاجرت یا استقرار در سرورهای دیگر باشد، انعطاف بیشتری را فراهم می‌آورد. او استدلال می‌کند که استفاده از دامنه شخصی، راهی هوشمندانه برای مدیریت بهتر وابستگی‌ها و افزایش امنیت پروژه است. این بحث، در فضای مجازی و در وبسایت «Hacker News»، بحث‌برانگیز شد و جامعه توسعه‌دهندگان نظرات متفاوتی ارائه دادند. عده‌ای اعتقاد دارند که تغییر عادت و استفاده از دامنه‌های شخصی نیازمند برنامه‌ریزی و هزینه‌های اضافی است، اما گروهی دیگر بر اهمیت این مسیر تاکید کرده و آن را راهی استفادۀ بلندمدت و امن‌تر می‌دانند. در نهایت، تصمیم‌گیری در این زمینه بستگی به نیازهای خاص هر پروژه و استراتژی توسعه‌دهنده دارد، اما کلیت ماجرا نشان می‌دهد که تفکیک وابستگی‌ها، همیشه یک استراتژی هوشمندانه در توسعه نرم‌افزار است. #برنامه‌نویسی #GoLang #امنیت #توسعه‌دهندگی 🟣لینک مقاله: https://iain.rocks/blog/dont-couple-your-go-code-to-github ➖➖➖➖➖➖➖➖ 👑 @gopher_academy
232
7
🔵 عنوان مقاله The Data Race That Wasn't a Bug (and the One That Was) 🟢 خلاصه مقاله: در دنیای برنامه‌نویسی، یکی از مفاهیم مهم و حساس، مسابقه داده‌ها یا همان «دیتا ریس» است. این وضعیت معمولاً زمانی اتفاق می‌افتد که همزمان چند بخش از برنامه سعی در دسترسی یا تغییر یک داده مشترک داشته باشند و این عملیات به نحوی تداخل پیدا کند که منجر به نتایجی غیرقابل‌پیش‌بینی و خطاهای سخت در اشکال‌زدایی می‌شود. در مواردی، این مسابقه‌های داده‌ای ناشی از خطای برنامه‌نویس یا ضعف در مدیریت حافظه نیستند، بلکه ممکن است نتیجه رفتارهای خاص زبان یا چارچوب‌های توسعه باشد که در نگاه اول غیرمنتظره و یا حتی بی‌مسئولیت به نظر برسند. در عنوان این موضوع، اتفاقی جالب و گاهی اوقات گیج‌کننده توضیح داده شده است: «مسابقه داده‌ها که واقعا خطا نبود (و آن دیگری که بود)». در حقیقت، در برخی موارد، تداخل داده‌ها به نظر می‌رسد مشکل بزرگی باشد، اما در واقع، رفتار مورد انتظار و منطقی سیستم است، و **نه‌تنها خطای برنامه‌نویس نیست بلکه ویژگی طراحی است**. این موضوع می‌تواند منجر به درک بهتر ساختارهای همزمانی در برنامه‌های چندنخی و نحوه مدیریت منابع در زبان‌هایی مانند Go شود. یکی از نمونه‌های ملموس این موارد، زمانی است که برنامه‌نویس قصد دارد پس از ارسال درخواست (request) به سرور، قبل از پایان خواندن کامل بدن درخواست، عملیات دیگری انجام دهد. این کار اگر به درستی مدیریت نشود، ممکن است به مسابقه داده‌ها منجر شود و به اصطلاح «ریس» را ایجاد کند؛ یعنی زمانی که یک بخش از برنامه می‌خواهد در حالی که بخش دیگر در حال تغییر همان داده است، به آن دسترسی پیدا کند. این اتفاق، اگر درک نادرستی از نحوه رفتار سیستم باشد، می‌تواند مشکلات جدی ایجاد کند. در این موارد، مهم است بدانیم چه رفتاری طبیعی است و چگونه باید کد را طوری طراحی کنیم که در مقابل چنین شرایطی مقاوم باشد. در نهایت، مطالعه این موارد به توسعه‌دهندگان کمک می‌کند تا درک عمیق‌تری نسبت به نحوه کارکرد سیستم‌های همزمان داشته باشند و بتوانند برنامه‌های کارآمد و امن‌تری بسازند. شناخت دقیق زمانی که یک «دیتا ریس» ممکن است رخ دهد و چه زمانی واقعاً خطای برنامه‌نویس است، کلید حل بسیاری از مشکلات در برنامه‌نویسی چندنخی و به اشتراک‌گذاری منابع است. #برنامه_نویسی #همزمانی #دیتا_ریس #پیشگیری 🟣لینک مقاله: https://victoriametrics.com/blog/http-race-condition/ ➖➖➖➖➖➖➖➖ 👑 @gopher_academy
211
8
🔵 عنوان مقاله a lively debate on Hacker News 🟢 خلاصه مقاله: در جامعه توسعه‌دهندگان و برنامه‌نویسان، موضوعات مختلفی همواره مورد بحث و گفت‌وگو قرار می‌گیرد. اخیراً، یکی از موضوعاتی که توجه زیادی را جلب کرده، بحثی پرحرارت در سایت Hacker News است که حول جدیدترین مقالات و اخبار دنیای برنامه‌نویسی می‌چرخد. این نوع گفتگوها نه تنها نشان‌دهنده‌ی میزان فعال بودن جامعه فنی است، بلکه فرصتی است برای تبادل نظر و به‌روزرسانی اطلاعات در حوزه‌های مختلف فناوری. در جدیدترین شماره خبرنامه هفتگی Golang، مطالب متنوع و جذابی پیرامون زبان برنامه‌نویسی Go مطرح شده است که برای توسعه‌دهندگان این زبان حائز اهمیت است و باعث بروز گفتگوهای فنی و تحلیلی میان کاربران می‌شود. این نشست‌های مجازی و بحث‌های عمومی، به طور چشمگیری باعث غنی‌تر شدن دانش فنی و افق دید چندجانبه در میان فعالان حوزه فناوری می‌شود. در کل، چنین مباحثی نشانگر زنده بودن و پویایی جامعه برنامه‌نویسان است که با اشتراک‌گذاری ایده‌ها و نظرات، مسیر پیشرفت و نوآوری در صنعت فناوری اطلاعات را هموار می‌سازند. این گفتگوها، جایی برای بیان دیدگاه‌ها، چالش‌ها و راه‌حل‌های جدید هستند که نقش مهمی در ارتقای مهارت‌ها و دانش فنی جمعی بازی می‌کنند. بنابراین، پیوستن به این نوع مباحث و دنبال کردن اخبار معتبر، برای هر توسعه‌دهنده و علاقه‌مند به فناوری ضروری است تا بتواند به روز بماند و بهتر در رقابت‌های دنیای دیجیتال حاضر باشد. #برنامه‌نویسی #گولنگ #تکنولوژی #فناوری 🟣لینک مقاله: https://news.ycombinator.com/item?id=49868404 ➖➖➖➖➖➖➖➖ 👑 @gopher_academy
224
9
🔵 عنوان مقاله Hooking into the Go Toolchain 🟢 خلاصه مقاله: در این مقاله، به بررسی جامع ابزارهای مربوط به زنجیره ابزار زبان برنامه‌نویسی Go پرداخته می‌شود و به طور خاص به کارکرد «go build -toolexec» می‌پردازد. این ابزار قدرتمند امکان کنترل و سفارشی‌سازی فرآیند کامپایل و لینکینگ را فراهم می‌کند. ابتدا با یک نمونه ساده از یک تایمر شروع می‌شود تا زمان اجرای فعالیت‌های مربوط به کامپایل را اندازه‌گیری کند، اما به تدریج به سمت موارد پیشرفته‌تر می‌رود. یکی از این موارد شامل بازنویسی کد در حین فرآیند ساخت است که به توسعه‌دهندگان اجازه می‌دهد ملاحظات خاص خود را در مسیر توسعه اعمال کنند. در ادامه، مقاله روند اصلاح فایل‌های پیکربندی واردات (importcfg) و افزودن واردات جدید را توضیح می‌دهد. این قابلیت به برنامه‌نویسان کمک می‌کند تا مدیریت واردات و وابستگی‌های پروژه‌های خود را به شکل موثرتری انجام دهند و در صورت نیاز واردات دلخواه را بر اساس شرایط مختلف اضافه کنند. همچنین با مرور نمونه‌های پروژه، نحوه پیاده‌سازی و بهره‌برداری از این ابزارهای پیشرفته در فرآیند تولید نرم‌افزار شرح داده می‌شود. در کل، این مطالب نشان می‌دهد که چطور می‌توان با استفاده از امکانات داخلی زبان برنامه‌نویسی Go، کنترل دقیق‌تر و سفارشی‌سازی بیشتری بر فرآیند ساخت برنامه داشت. این شناخت به توسعه‌دهندگان کمک می‌کند تا فرآیندهای ساخت خود را بهینه‌تر و مناسب‌تر برای نیازهای خاص پروژه‌هایشان تنظیم کنند، و در نتیجه محصولی سریع‌تر و بهینه‌تر تولید کنند. #برنامه‌نویسی #زبان_گو #ابزارهای_توسعه #توسعه_نرم‌افزار 🟣لینک مقاله: https://internals-for-interns.com/posts/hooking-into-the-go-toolchain/ ➖➖➖➖➖➖➖➖ 👑 @gopher_academy
197
10
🔵 عنوان مقاله platform-independent SIMD in Go 🟢 خلاصه مقاله: در دنیای برنامه‌نویسی، بهره‌گیری از دستورهای SIMD (همزمان‌سازی چند داده‌ای) نقش حیاتی در بهبود عملکرد و کارایی برنامه‌ها دارد. در این مقاله، به معرفی پکیج آزمایشی archsimd در زبان برنامه‌نویسی Go پرداخته می‌شود که اکنون از معماری‌های arm64 و wasm پشتیبانی می‌کند. این پکیج، امکان سازگاری و اجرای کدهای SIMD بر روی پلتفرم‌های مختلف را فراهم می‌کند و به توسعه‌دهندگان این امکان را می‌دهد تا بدون نگرانی از تفاوت‌های معماری، کدهای بهینه و سریع بنویسند. در ادامه، نکاتی مهم برای نوشتن کدهای SIMD ارائه می‌شود که باعث می‌شود کدهای نوشته‌شده به خوبی کامپایل شده و در نتیجه، عملکرد بهتری داشته باشند. این مطالب به توسعه‌دهندگان کمک می‌کند تا در دنیای چندپلتفرم، برنامه‌هایی با کارایی بالا و سازگار بنویسند و از امکانات جدید در معماری‌های مختلف بهره‌مند شوند. #برنامه_نویسی #بهبود_عملکرد #کد_بهینه #پشتیبانی_پلتفرم 🟣لینک مقاله: https://go.dev/blog/simd-experiment ➖➖➖➖➖➖➖➖ 👑 @gopher_academy
213
11
🔵 عنوان مقاله Hacking the Go Compiler to Efficiently Map IPv4 to IPv6 🟢 خلاصه مقاله: در دنیای تکنولوژی امروز، تبدیل سریع و کارآمد بین آدرس‌های IPv4 و IPv6 اهمیت زیادی دارد، مخصوصاً در توسعه و بهبود شبکه‌های اینترنتی. در این زمینه، وینسنت موفق شد با هک کردن کامپایلر زبان Go، روشی مؤثر برای نقشه‌برداری از آدرس‌های IPv4 به IPv6 پیدا کند. این فرآیند کوچک اما حیاتی، او را وادار کرد تا به سراغ اصلاحات در نودهای کد، قوانین بازنویسی SSA و ترتیب اجرای عبورهای کامپایلر برود تا بتواند فاصله عملکردی حدود ۸ برابری را کاهش دهد. این دستاورد نشان می‌دهد که با کمی خلاقیت و مهارت در هک کردن ساختارهای داخلی کامپایلر، می‌توان بهبودهای چشمگیری در سرعت و کارایی برنامه‌های وابسته به شبکه حاصل کرد. وینسنت با این روش، نه تنها توانست بر مشکل عملکرد غلبه کند، بلکه راهی نوآورانه برای بهبود فرآیندهای تبدیل آدرس‌های شبکه‌ای فراهم ساخت که می‌تواند در پروژه‌های بزرگ‌تر و آینده‌نگر کاربردی باشد. نتیجه، بهره‌گیری بهتر از منابع و افزایش سرعت در پردازش‌ها است که تاثیر مستقیم بر کیفیت و کارایی شبکه‌ها دارد. #شبکه #IPv6 #پروگرمینگ #بهبود_کارایی 🟣لینک مقاله: https://vincent.bernat.ch/en/blog/2026-go-netip-addrto6 ➖➖➖➖➖➖➖➖ 👑 @gopher_academy
227
12
🔵 عنوان مقاله Arch-Specific SIMD in Go 🟢 خلاصه مقاله: در یک نگاه جدید به فناوری SIMD در زبان برنامه‌نویسی گو، تیم توسعه این زبان به بررسی بسته‌ آزمایشی archsimd پرداخته‌اند. این بسته، که در نسخه‌های قبلی تنها برای پشتیبانی از معماری‌هایی مانند x86 طراحی شده بود، اکنون توانسته است با افزودن پشتیبانی از معماری‌های arm64 و wasm، امکانات بسیار گسترده‌تری را برای توسعه‌دهندگان فراهم کند. هدف این توسعه، تسهیل نوشتن کدهای SIMD است که در تولید نرم‌افزارهای چندپلتفرمی و کارآمد نقش موثری ایفا می‌کنند. این اقدام نشان‌دهنده تلاش تیم گو برای کاهش وابستگی به معماری خاص و ارائه ابزارهای عملی جهت توسعه برنامه‌هایی است که در بسترهای مختلف قابل اجرا باشند. در کنار معرفی این بسته، توصیه‌هایی نیز برای نگارش کدهای SIMD ارائه شده است تا برنامه‌نویسان بتوانند کدهای بهینه و سازگار با سیستم‌عامل‌ها و معماری‌های مختلف بنویسند و از حداکثر بهره‌وری بهره‌مند شوند. #برنامه‌نویسی #Go #SIMD #توسعه_پلتفرم 🟣لینک مقاله: https://go.dev/blog/archsimd ➖➖➖➖➖➖➖➖ 👑 @gopher_academy
261
13
🔵 عنوان مقاله connect-go v2 Arrives with Simpler, gRPC-Go-Style Handlers 🟢 خلاصه مقاله: نسخه جدید connect-go به شماره ۲ منتشر شد، که تغییرات مهمی در ساختار و عملکرد آن ایجاد کرده است. این نسخه با هدف ساده‌تر کردن روند توسعه و کاهش پیچیدگی‌ها طراحی شده است، به خصوص در نوع رهگیری و مدیریت درخواست‌ها و پاسخ‌ها. یکی از ویژگی‌های برجسته این نسخه، حذف پوشش‌های عمومی برای درخواست‌ها و پاسخ‌ها است، که باعث شفاف‌تر و قابل فهم‌تر شدن فرآیند می‌شود. علاوه بر این، قسمت مربوط به پروتکل HTTP از هسته اصلی کتابخانه جدا شده است تا توسعه و نگهداری آن آسان‌تر گردد، و ارتباط‌های gRPC بهتر پشتیبانی شوند. در این نسخه، پیام‌های خطای ساده و مستقیم در زبان Go دیگر به مشتریان ارسال نمی‌شود؛ بلکه خطاها به صورت ساختاری و استاندارد مدیریت می‌گردند. همچنین، ابزاری برای مهاجرت از نسخه قبلی به جدید توسعه یافته است و امکان همزمان استفاده از نسخه‌های ۱ و ۲ در یک ماژول مهیا است، که روند انتقال و به‌روزرسانی را بسیار آسان‌تر می‌کند. تمامی این تغییرات در کنار طراحی سبک و استانداردهای gRPC-Go، تجربه توسعه‌دهندگان را بهبود می‌بخشد و امکان ساخت سرویس‌های سریع و مطمئن را فراهم می‌سازد. نسخه جدید connect-go، راه حل مناسبی برای برنامه‌نویسان گرا و توسعه‌دهندگانی است که به دنبال نویسه‌های ساده و در عین حال قدرتمند در ارتباطات RPC هستند و می‌خواهند ساختار پروژه‌هایشان را بهبود بخشند. #برنامه‌نویسی #gRPC #کتابخانه_گو #توسعه_نرم‌افزار 🟣لینک مقاله: https://buf.build/blog/connect-go-v2 ➖➖➖➖➖➖➖➖ 👑 @gopher_academy
266
14
🔵 عنوان مقاله fx 40: Interactive Terminal JSON Viewer and Processor 🟢 خلاصه مقاله: نسخه ۴۰ اف‌اکس (fx) تحول بزرگی در ابزارهای نمایش و پردازش فایل‌های JSON است. در طول سال‌ها، بارها این ابزار را معرفی کرده‌ایم، اما نسخه جدید آن با ویژگی‌های قابل توجهی عرضه شده است که تجربه کار با فایل‌های داده‌ی ساخت‌یافته را به سطح تازه‌ای می‌برد. اکنون می‌توانید در داخل خود صفحه نمایش، کوئری‌های مختلف بنویسید و بلافاصله نتایج را در حین تایپ مشاهده کنید؛ این ویژگی، فرآیند تحلیل و فیلتر کردن داده‌ها را بسیار سریع و کاربرپسند می‌سازد. علاوه بر JSON، این ابزار از ورودی‌های XML، HTML، EDN و MAML نیز پشتیبانی می‌کند که امکان پردازش انواع فرمت‌های داده را فراهم می‌آورد. یکی دیگر از امکانات جذاب، اجرای دستورات شبیه به ویم است که به کاربران امکان می‌دهد با کنترل‌های سریع و کمکی، کار خود را ساده‌تر انجام دهند. نسخه ۴۰ اف‌اکس، یک ابزار جامع و پیشرفته است که جایگزین بی‌نظیر برای توسعه‌دهندگان و تحلیل‌گران داده‌های ساخت‌یافته محسوب می‌شود. #نمایشگر_JSON #ابزار_توسعه #پردازش_داده #تکنولوژی 🟣لینک مقاله: https://github.com/antonmedv/fx ➖➖➖➖➖➖➖➖ 👑 @gopher_academy
258
15
🔵 عنوان مقاله Francis: Durable Actors, Jobs and Workflows for Go 🟢 خلاصه مقاله: در دنیای نرم‌افزار، عملکرد پایدار و قابل اعتماد نقش اساسی دارد. یکی از مهم‌ترین نیازهای توسعه‌دهندگان، ایجاد فرآیندها و فعالیت‌هایی است که توانایی اجرای مداوم و بدون خطا در پس‌زمینه را دارا باشند. این فعالیت‌ها می‌توانند به صورت بازیگران پایدار، وظایف زمان‌بندی شده یا عملیات پس‌زمینه با قابلیت تکرار طراحی شوند تا اطمینان حاصل شود که کارها حتی در صورت بروز خطا یا توقف سیستم، ادامه یابند و نتیجه مطلوب تضمین گردد. برای مدیریت این وظایف، رویکردهای مدرن از جمله کنترل نرخ، الگوهای گردش کار مبتنی بر سقاگر و اجرای مستقل برای کلسترهای بزرگ، توسعه یافته‌اند. این ابزارها و فرآیندها، به صورت یکپارچه در داخل برنامه‌های شما جاسازی شده و بر بستر پایگاه داده‌های SQLite یا Postgres عمل می‌کنند. در نتیجه، می‌توان به راحتی مجموعه‌های گسترده‌تری از وظایف را در محیط‌های مختلف اجرا و مدیریت کرد. علاوه بر این، یک حالت اجرایی مستقل برای کلسترهای بزرگ‌تر هم قابل نصب است، که امکان مدیریت بهتر و مقیاس‌پذیری عالی را فراهم می‌آورد. در مجموع، این راهکارها امکان طراحی سامانه‌های پایدار، مقیاس‌پذیر و قابل اعتماد را فراهم کرده و توسعه‌دهندگان را در پیاده‌سازی سیستم‌های مقاوم و با کارایی بالا یاری می‌دهند. #نظام_پایدار #وظایف_خودکار #مدیریت_وظایف #برنامه‌نویسی 🟣لینک مقاله: https://withblue.ink/2026/10/francis-stable ➖➖➖➖➖➖➖➖ 👑 @gopher_academy
321
16
sticker.webp
366
17
🎖 Faster memory allocation در Go 1.27، کامپایلر اکنون فراخوانی‌هایی را برای رویه‌های تخصیص حافظه تخصصی‌شده بر اساس اندازه (size-specialized memory allocation routines) تولید می‌کند. این تغییر هزینه برخی از تخصیص‌های کوچک، یعنی تخصیص‌های کمتر از ۸۰ بایت، را تا حدود ۳۰٪ کاهش می‌دهد. میزان بهبود به workload بستگی دارد، اما انتظار می‌رود در برنامه‌های واقعی که به‌شدت متکی بر allocation هستند، بهبود کلی حدود ۱٪ باشد. در مقابل، این بهینه‌سازی حدود ۶۰ کیلوبایت افزایش اندازه باینری ایجاد می‌کند و این افزایش مستقل از workload است. نیاز به هیچ تغییری در کد نیست این قابلیت کاملاً شفاف است؛ یعنی لازم نیست هیچ تغییری در کد Go خود ایجاد کنید. کامپایلر و runtime مسیر بهینه‌تر تخصیص حافظه را به‌صورت خودکار استفاده می‌کنند و در نتیجه برخی allocationهای کوچک کمی سریع‌تر می‌شوند. اگر به هر دلیل بخواهید این قابلیت را غیرفعال کنید، می‌توانید برنامه را با این گزینه build کنید: GOEXPERIMENT=nosizespecializedmalloc این گزینه‌ی opt-out موقتی است و انتظار می‌رود در Go 1.28 حذف شود.
367
18
🎖 Generalized function type inference در Go 1.27، قابلیت استنتاج نوع تابع (function type inference) تعمیم پیدا کرده است و اکنون در تمام موقعیت‌هایی که یک generic function در جایی استفاده می‌شود که یک function type سازگار مورد انتظار است، کاربرد دارد. پیش از این، استنتاج نوع در یک assignment ساده به متغیر امکان‌پذیر بود؛ اما در موقعیت‌هایی مانند conversion و composite literal، لازم بود type argumentها را صراحتاً مشخص کنید. دو تابع کمکی جنریک زیر را در نظر بگیرید: func first[T any](s []T) T { return s[0] } func last[T any](s []T) T { return s[len(s)-1] } حالا می‌خواهیم این دو تابع را در یک slice قرار دهیم که نوع عناصر آن func([]int) int است: // نوع عنصر slice، مبنای استنتاج است: // برای هر دو تابع، T برابر int است. // پیش از Go 1.27 این کد با خطای // "cannot use generic function without instantiation" // مواجه می‌شد و باید first[int] و last[int] را می‌نوشتیم. ops := []func([]int) int{ first, last, } for _, op := range ops { fmt.Println(op([]int{10, 20, 30})) } در اینجا کامپایلر از نوع مورد انتظار تابع، یعنی: func([]int) int استفاده می‌کند و نتیجه می‌گیرد که: T = int بنابراین دیگر نیازی به instantiation صریح مانند first[int] و last[int] نیست. این تعمیم باعث می‌شود استفاده از generic functionها در ساختارهایی مثل slice، composite literal و conversion طبیعی‌تر و کم‌حجم‌تر شود، چون type context اطراف تابع می‌تواند type argumentهای لازم را به‌صورت خودکار تعیین کند.
278
19
🎖 Struct literal field selectors در Go 1.27، کلید مورد استفاده در یک struct literal می‌تواند هر field selector معتبر برای آن نوع struct باشد؛ دیگر محدود به نام فیلدهای سطح اول نیست. در عمل، این یعنی می‌توانید یک فیلد (promoted field) ــ یعنی فیلدی که از یک structِ embedded به ارث رسیده است ــ را مستقیماً مقداردهی کنید، بدون اینکه نام نوع embedded را صراحتاً بنویسید. فرض کنید: type Base struct { ID int } type User struct { Base Name string } در نسخه‌های قبل از Go 1.27، برای مقداردهی ID باید نوع embedded یعنی Base را نیز در literal مشخص می‌کردید: User{ Base: Base{ID: 7}, Name: "Mittens", } اما در Go 1.27، فیلد ترفیع‌یافته‌ی ID می‌تواند مستقیماً به‌عنوان کلید struct literal استفاده شود: u := User{ ID: 7, Name: "Mittens", } fmt.Println(u.ID, u.Name) به این ترتیب، دیگر لازم نیست برای مقداردهی یک فیلد promoted، ساختار embedded را به‌صورت تو در تو در literal بازسازی کنید. این تغییر کوچک است، اما هنگام کار با structهای دارای embedding، syntax را ساده‌تر و مستقیم‌تر می‌کند.
196
20
از این پس، تعریف یک متد می‌تواند پارامترهای نوع (type parameters) مخصوص به خود را داشته باشد؛ این پارامترها مستقل از پارامترهای نوعِ (receiver) هستند. پیش از Go 1.27، فقط توابع سطح پکیج (top-level functions) می‌توانستند جنریک باشند. بنابراین اگر می‌خواستید عملیاتی جنریک روی یک type داشته باشید، مجبور بودید آن را به‌صورت یک تابع در سطح پکیج تعریف کنید، نه به‌عنوان متد آن type. فرض کنید یک container جنریک داریم و می‌خواهیم عملیاتی به نام Map داشته باشیم که بتواند نوع عنصر را تغییر دهد: type Box[T any] struct{ v T } // متد پارامتر نوع مستقل U را برای خودش تعریف می‌کند. // این قابلیت در Go 1.27 جدید است. func (b Box[T]) Map[U any](f func(T) U) Box[U] { return Box[U]{v: f(b.v)} } در اینجا T پارامتر نوعِ خود Box است، در حالی که U پارامتر نوعی است که خود متد Map تعریف می‌کند. بنابراین Map اکنون واقعاً یک متد از Box است و می‌تواند یک Box[int] را به Box[string] تبدیل کند: func main() { b := Box[int]{v: 21} doubled := b.Map(func(n int) int { return n * 2 }) label := doubled.Map(func(n int) string { return fmt.Sprintf("value=%d", n) }) fmt.Println(label.v) } در این مثال، ابتدا: Box[int] │ │ Map(func(int) int) ▼ Box[int] و سپس: Box[int] │ │ Map(func(int) string) ▼ Box[string] یعنی پارامتر نوع U در هر فراخوانی می‌تواند مقدار متفاوتی داشته باشد و مستقل از T تعریف‌شده برای Box است. یک محدودیت مهم با وجود اضافه‌شدن متدهای جنریک، interfaceها همچنان نمی‌توانند متدهای دارای پارامتر نوع تعریف کنند. در نتیجه، یک متد جنریک نمی‌تواند برای satisfy کردن یک interface مورد استفاده قرار گیرد. اگر متدی با پارامتر نوع را داخل یک interface قرار دهید، کامپایلر خطا می‌دهد: type Mapper interface { Map[U any](f func(int) U) any } خطای کامپایلر: interface method must have no type parameters بنابراین قابلیت جدید، دامنه استفاده از generics در سطح متدها را گسترش می‌دهد، اما محدودیت مهمی در تعامل آن با interfaceها باقی می‌ماند. یک CTA عملی برای Go developers اضافه کنمقایسهٔ تابع پکیجی قدیمی را اضافه کن
239