Gopher Academy
3.85K subscribers
933 photos
42 videos
280 files
2.21K links
🕸 Gopher Academy

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

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

ادمین:
@mrbardia72
Download Telegram
Gopher Academy
💋چی کار می‌کنه sync.Once تضمین می‌کنه یک تابع دقیقاً یک‌بار اجرا بشه حتی اگر چندین goroutine هم‌زمان تلاش کنن اون رو اجرا کنن. متد اصلیش Do(f func()) هست: اولین فراخوانی Do تابع f را اجرا می‌کنه و فراخوانی‌های بعدی هیچ کاری نمی‌کنن (بلوک نمی‌شن؛ فقط بازمی‌گردن).…
بیایید هر دو حالت را ببینیم:
۱️⃣ نمونهٔ Retry‌دار (برای مواقعی که تابع ممکن است خطا بدهد)
۲️⃣ نمونهٔ واقعی‌تر (مثلاً بارگذاری فایل کانفیگ فقط یک‌بار)

---
🧩 مثال ۱: sync.Once با قابلیت Retry

sync.Once به‌صورت پیش‌فرض فقط یک‌بار اجرا می‌شود — حتی اگر اون اجرا شکست بخوره.
اما گاهی می‌خواهیم تابع فقط *در صورت موفقیت* «once» باشد، وگرنه دفعهٔ بعدی دوباره تلاش کند.
برای این کار، باید رفتار خودمان را روی Once شبیه‌سازی کنیم:

package main

import (
"errors"
"fmt"
"sync"
)

type OnceRetry struct {
mu sync.Mutex
done bool
}

func (o *OnceRetry) Do(f func() error) error {
o.mu.Lock()
defer o.mu.Unlock()

if o.done {
return nil
}

err := f()
if err != nil {
return err
}

o.done = true
return nil
}

func main() {
var once OnceRetry
counter := 0

task := func() error {
counter++
if counter < 3 {
fmt.Println(" Failed attempt", counter)
return errors.New("temporary error")
}
fmt.Println(" Success on attempt", counter)
return nil
}

for i := 0; i < 5; i++ {
err := once.Do(task)
if err != nil {
fmt.Println("Error:", err)
}
}

fmt.Println("Final counter =", counter)
}


🟢 نتیجه خروجی:

 Failed attempt 1
Error: temporary error
Failed attempt 2
Error: temporary error
Success on attempt 3
Final counter = 3


یعنی تابع تا زمانی که موفق نشده، باز هم قابل اجراست — اما بعد از موفقیت فقط یک‌بار انجام می‌شود

🧱 مثال ۲: بارگذاری فایل کانفیگ فقط یک‌بار (Real-world)

package main

import (
"encoding/json"
"fmt"
"os"
"sync"
)

type Config struct {
Port int `json:"port"`
Mode string `json:"mode"`
}

var (
cfg Config
cfgErr error
cfgOnce sync.Once
)

func LoadConfig() (Config, error) {
cfgOnce.Do(func() {
fmt.Println("📁 Reading config.json only once...")
data, err := os.ReadFile("config.json")
if err != nil {
cfgErr = err
return
}
cfgErr = json.Unmarshal(data, &cfg)
})
return cfg, cfgErr
}

func main() {
for i := 0; i < 3; i++ {
c, err := LoadConfig()
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("Loaded config:", c)
}
}
}


🔹 حتی اگر LoadConfig() چندبار فراخوانی شود، فایل فقط یک‌بار خوانده می‌شود.
🔹 در برنامه‌های بزرگ (microserviceها، سرورها، یا SDKها) این pattern خیلی رایج است.
2🔥1
🔵 عنوان مقاله
Chans: Building Blocks for Idiomatic Go Pipelines

🟢 خلاصه مقاله:
** آنتون در مقاله «Chans: Building Blocks for Idiomatic Go Pipelines» بسته‌ی chans را معرفی می‌کند؛ مجموعه‌ای از عملگرهای عمومی و نوع‌امن روی channelها در زبان Go—مثل filter، map، partition و takeWhile—برای ساختpipelineهای همزمان به‌شکل idiomatic. این بسته با کاهش کد تکراری و افزایش ترکیب‌پذیری، نوشتن جریان‌های پردازش داده را ساده‌تر، خواناتر و قابل نگه‌داری‌تر می‌کند و برای پردازش جریان‌ها، رویدادها و کارهای IO-محور بسیار کاربردی است.

#Go #Concurrency #Channels #Pipelines #Generics #FunctionalProgramming #SoftwareEngineering

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


👑 @gopher_academy
👍3
Gopher Academy
🔵 عنوان مقاله Chans: Building Blocks for Idiomatic Go Pipelines 🟢 خلاصه مقاله: ** آنتون در مقاله «Chans: Building Blocks for Idiomatic Go Pipelines» بسته‌ی chans را معرفی می‌کند؛ مجموعه‌ای از عملگرهای عمومی و نوع‌امن روی channelها در زبان Go—مثل filter،…
Here's a toy example:
// Given a channel of documents.
docs := make(chan []string, 10)
docs <- []string{"go", "is", "awesome"}
docs <- []string{"cats", "are", "cute"}
close(docs)

// Extract all words from the documents.
words := make(chan string, 10)
chans.Flatten(ctx, words, docs)
close(words)

// Calculate the total byte count of all words.
step := func(acc int, word string) int { return acc + len(word) }
count := chans.Reduce(ctx, words, 0, step)
fmt.Println("byte count =", count)

byte count = 22
👍2
Gopher Academy
📌 Memory Allocation in Go این پست اپدیت می‌شود 🔹 در این پست به بررسی جزئیات مدیریت حافظه در زبان Go می‌پردازیم. درک درست از ساختار حافظه به شما کمک می‌کند عملکرد برنامه‌هایتان را بهتر بهینه کنید و رفتار Garbage Collector را بهتر بفهمید. 🔵 Introduction…
این تصویر نمونه‌ای از مفهوم Summary برای یک bitmap در حافظه‌ی Go رو نشون می‌ده

🧩 این Bitmap Summary در مدیریت صفحات Go

در این شکل، هر بیت از bitmap نشان‌دهنده‌ی وضعیت یک صفحه‌ی حافظه است:

* 0 → صفحه آزاد (free)
* 1 → صفحه در حال استفاده (allocated)

برای بهینه‌سازی جستجوی صفحات آزاد، Go برای هر bitmap سه مقدار خلاصه‌شده (summary) نگه می‌داره:

* start = 3 → یعنی در ابتدای bitmap، ۳ صفحه‌ی متوالی آزاد داریم
* end = 7 → یعنی در انتهای bitmap، ۷ صفحه‌ی متوالی آزاد داریم
* max = 10 → طولانی‌ترین دنباله‌ی صفحات آزاد در کل bitmap برابر با ۱۰ صفحه است

🔹 فلش در تصویر جهت افزایش آدرس حافظه (از پایین به بالا) رو نشون می‌ده.
در نتیجه، ۳ صفحه‌ی آزاد در بخش پایین‌تر حافظه (low address) و ۷ صفحه‌ی آزاد در بالاترین بخش (high address) قرار دارن.

این ساختار باعث می‌شه Go خیلی سریع‌تر بتونه محدوده‌های بزرگ از صفحات آزاد رو پیدا کنه بدون این‌که کل bitmap رو اسکن کنه — فقط با نگاه کردن به summaryها!

👑 @gopher_academy
👍1🔥1
🔵 عنوان مقاله
progjpeg: image/jpeg But With Progressive Encoding Support

🟢 خلاصه مقاله:
progjpeg نسخه‌ای از بسته image/jpeg در زبان Go است که امکان Progressive Encoding را به آن اضافه می‌کند؛ قابلیتی که تصویر را ابتدا به‌صورت کم‌جزئیات نشان می‌دهد و در چند گذر با دریافت داده‌های بیشتر شفاف‌تر می‌شود. این ویژگی می‌تواند در شبکه‌های کند تجربه کاربری را بهبود دهد و توسط بیشتر مرورگرها و دیکدرهای تصویر پشتیبانی می‌شود. چون درخواست افزودن این قابلیت در مخزن رسمی Go «متوقف/فریز» شده بود، progjpeg این خلأ را برای توسعه‌دهندگان پر می‌کند. هرچند کاربرد آن تخصصی است، اما برای سرویس‌های وب و سامانه‌های سنگینِ تصویر می‌تواند تجربه بارگذاری روان‌تری فراهم کند، با درنظرگرفتن ملاحظاتی مثل پیچیدگی کدنویسی و تفاوت احتمالی در اندازه فایل.

#Go #Golang #JPEG #ProgressiveJPEG #ImageProcessing #WebPerformance #OpenSource

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


👑 @gopher_academy
Clients should not be forced to depend on methods they do not use.


— Robert C. Martin (SOLID, interface segregation principle)
👍2
🔵 عنوان مقاله
docxgo: A Library for Manipulating Microsoft Word Documents

🟢 خلاصه مقاله:
docxgo یک کتابخانه برای کار برنامه‌نویسی با اسناد Microsoft Word با فرمت .docx است که امکان ساخت، خواندن و ویرایش خودکار اسناد را فراهم می‌کند. نمونه‌کدهای همراه، مراحل پایه مانند بازکردن سند، پیمایش ساختار، افزودن یا ویرایش پاراگراف‌ها و سبک‌ها و ذخیره‌سازی خروجی را نشان می‌دهند. این پروژه تکامل‌یافته‌ی کتابخانه Docx است و با بهبود سازگاری با Microsoft Word، گسترش پوشش قابلیت‌ها (مانند جداول، تصاویر، سرصفحه/پاصفحه و بخش‌بندی) و بهبود کارایی و مدیریت خطا، تجربه توسعه یکپارچه‌تری ارائه می‌دهد. از تولید گزارش‌ها و قراردادهای مبتنی بر قالب تا ادغام در سرویس‌های پشتیبان و ابزارهای خط فرمان، docxgo برای خودکارسازی فرآیندهای اسنادی و استانداردسازی قالب‌بندی گزینه‌ای مناسب است.

#docxgo #MicrosoftWord #DOCX #DocumentAutomation #DeveloperTools #WordProcessing #APIs

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


👑 @gopher_academy
👍1
🔵 عنوان مقاله
"I'm Independently Verifying Go's Reproducible Builds"

🟢 خلاصه مقاله:
** از نسخه Go 1.21، ابزارهای اصلی Go به‌صورت Reproducible Builds عرضه می‌شوند؛ یعنی اگر همان سورس را دوباره بسازید، برای هر هدف مشخص، خروجی دقیقا همسانِ بایت‌به‌بایت تولید می‌شود و به محیط میزبان وابسته نیست. این مقاله گزارشی از یک راستی‌آزمایی مستقل است: دریافت سورس از ریلیزهای رسمی، ساخت در محیط‌های ایزوله روی میزبان‌های متفاوت، تولید ابزارها برای تارگت‌های یکسان و مقایسه هش‌ها با یکدیگر و با چک‌سام‌های رسمی. نتیجه نشان می‌دهد که از Go 1.21 به بعد، Go toolchain طبق وعده قابل بازتولید است. این کار، در کنار انتشار رسمی، اعتماد را افزایش می‌دهد، ریسک دست‌کاری در زنجیره تامین نرم‌افزار را کاهش می‌دهد و به کاربران امکان می‌دهد خروجی‌های منتشرشده را خودشان مستقلانه راستی‌آزمایی کنند.

#ReproducibleBuilds #Go #Golang #SupplyChainSecurity #DeterministicBuilds #OpenSource #DevSecOps

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


👑 @gopher_academy
1
Forwarded from DevOps Labdon
🔵 عنوان مقاله
Cost-optimized ml on production: autoscaling GPU nodes on Kubernetes to zero using keda

🟢 خلاصه مقاله:
این آموزش نشان می‌دهد چگونه با استفاده از Kubernetes و KEDA ظرفیت GPU را بر اساس طول صف پیام‌ها به‌صورت خودکار تا صفر کاهش دهیم و هزینه اجرای ML در محیط تولید را کم کنیم. معماری مبتنی بر یک message queue (مثل Kafka، RabbitMQ یا AWS SQS) است و KEDA با ScaledObject تعداد پادهای مصرف‌کننده GPU را نسبت به backlog تنظیم می‌کند (minReplicaCount=0). با فعال‌بودن Cluster Autoscaler و یک GPU node pool با حداقل اندازه صفر، نودهای GPU فقط هنگام نیاز ایجاد و سپس آزاد می‌شوند. نکات کلیدی شامل تنظیم nodeSelector/tolerations، درخواست nvidia.com/gpu، کنترل pollingInterval/cooldownPeriod، کاهش cold start با pre-pull و پایش با Prometheus/Grafana است. نتیجه: پرداخت هزینه GPU فقط هنگام وجود کار، همراه با حفظ قابلیت اطمینان و کنترل تأخیر.

#Kubernetes #KEDA #GPU #MLOps #Autoscaling #CostOptimization #MessageQueue #ProductionML

🟣لینک مقاله:
https://ku.bz/Zhb9q3BZx


👑 @DevOps_Labdon
2
🔵 عنوان مقاله
A look into how JavaScript source maps work

🟢 خلاصه مقاله:
خلاصه‌ای از ساخت‌وکار source map در JavaScript: کدی که در مرورگر اجرا می‌شود معمولاً پس از transpile، bundle و minify با کد اصلی تفاوت دارد. source map پلی است میان این دو تا بتوانید در DevTools مثل کد اصلی breakpoint بگذارید و خطاها را بخوانید. یک source map فایل JSONی است با فیلدهایی مثل version، file، sources، names، sourcesContent و یک رشته mappings که با Base64 VLQ فشرده شده و با بخش‌های دلتایی موقعیت‌های کد تولید‌شده را به سطر/ستون‌های فایل‌های اصلی (و در صورت وجود، نام‌ها) نگاشت می‌کند. ابزارهایی مثل TypeScript و Babel نگاشت را هنگام تبدیل می‌سازند، Webpack/Rollup/esbuild آن‌ها را ترکیب می‌کنند و Terser در مرحله minify این زنجیره را حفظ می‌کند؛ این همان chain شدن source map است. مرورگر از طریق دستور sourceMappingURL (فایل خارجی یا data URI) map را می‌خواند و با رعایت CORS آن را decode کرده و در DevTools نمایش و دیباگ را بر اساس کد اصلی ممکن می‌سازد؛ همچنین پلتفرم‌هایی مثل Sentry با دریافت map می‌توانند stack traceهای production را de-minify کنند. در عمل، به خاطر اندازه و حریم خصوصی، بهتر است در production از الگوهایی چون hidden-source-map یا nosources-source-map، میزبانی امن، و فشرده‌سازی/کش استفاده کنید. محدودیت‌ها شامل دقت ستونی ناقص در برخی تبدیل‌ها، کدهای dynamic/eval، ناسازگاری مسیرها و سوگیری‌های نگاشت است. بهترین رویه‌ها: فعال‌سازی map در تمام مراحل build، اعتبارسنجی در DevTools، اطمینان از CORS مناسب برای ابزار خطا، کنترل نسخه ابزارها و آزمون remap شدن خطاها در CI.

#JavaScript #SourceMaps #WebDev #Debugging #DevTools #Bundlers #Performance

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


👑 @gopher_academy
👍1
🔵 عنوان مقاله
Livecore: A Low-Pause Core File Dumper for Linux Processes

🟢 خلاصه مقاله:
این مقاله Livecore را معرفی می‌کند؛ ابزاری برای گرفتن core file از فرایندهای در حال اجرای Linux با وقفه بسیار کم. این ابزار که در یک جلسه «vibe coding» توسط Brad Fitzpatrick (عضو پیشین تیم Go) ساخته شده، امکان ساخت آنی و کم‌اختلال snapshot از حافظه و وضعیت اجرای فرایند را فراهم می‌کند تا بدون متوقف کردن سرویس، داده‌های لازم برای عیب‌یابی به‌دست آید. به‌جای تکیه بر crash یا توقف کامل فرایند، Livecore با بهره‌گیری از goref و قابلیت‌های Linux تلاش می‌کند تصویری دقیق و با سربار اندک تهیه کند و برای بررسی با ابزارهای post-mortem به کار رود. نتیجه، ابزاری عملی برای تیم‌های توسعه و SRE است که به observability کم‌اختلال—به‌ویژه در سرویس‌های Go روی Linux—نیاز دارند.

#Livecore #Linux #CoreDump #Debugging #Go #Observability #BradFitzpatrick #goref

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


👑 @gopher_academy
🔵 عنوان مقاله
Claude Code Can Debug Low-Level Cryptography

🟢 خلاصه مقاله:
** فیلیپو که به‌خاطر کارهای مداومش روی رمزنگاری در Go شناخته می‌شود، به‌تازگی پیاده‌سازی‌ای از الگوریتم امضای پساکوانتومی ML-DSA ساخته است. او هنگام توسعه با باگی روبه‌رو شد که در سطح پایین رخ می‌داد و با روش‌های معمول به‌سادگی آشکار نمی‌شد.

او از Claude Code کمک گرفت و این ابزار توانست همان «باگ سطح پایینِ نسبتاً پیچیده» را شناسایی کند و علت ریشه‌ای مشکل را روشن سازد. این تجربه نشان می‌دهد که دستیارهای کدنویسی مبتنی بر هوش مصنوعی می‌توانند در پروژه‌های حساسِ رمزنگاری نیز به کشف سریع‌تر خطاها کمک کنند—البته همچنان نیاز به آزمون‌های قابل بازتولید، اعتبارسنجی سخت‌گیرانه و بازبینی انسانی باقی است.

#Cryptography #PostQuantum #MLDSA #Go #Debugging #AI #CodeAssistants #ClaudeCode

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


👑 @gopher_academy
👍1🔥1