Gopher Academy
3.33K subscribers
916 photos
40 videos
279 files
1.96K links
🕸 Gopher Academy

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

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

ادمین:
@mrbardia72
Download Telegram
Forwarded from AI Labdon
✍️Alireza KiakojouriAlireza Kiakojouri

بنیانگذار تلگرام: ChatGPT فکر نمی‌کند، فقط حرف می‌زند!/ پروژه‌ی مخفی برادران دورف چیست؟

پاول دورف به نشریه فرانسوی «لو پوئن» گفت: «مدل‌های هوش مصنوعی مثل ChatGPT فکر نمی‌کنند. فقط مقدار زیادی متن خوانده‌اند و پاسخی می‌دهند که به نظر درست می‌آید. اما واقعاً نمی‌فهمند و ما انسان‌ها چون زبان پیچیده را نشانه هوش می‌دانیم، فریب می‌خوریم. مدل‌های زبانی فقط حرف می‌زنند. اما این به معنای فهمیدن یا فکر کردن نیست.»

پاول می‌گوید برادرش (نیکلای دورف) اکنون روی ساخت مدلی کار می‌کند که واقعاً بتواند منطق را درک کند، تصمیم بگیرد و دنیای واقعی را بفهمد. او مدعی است این پروژه چیزی فراتر از مدل‌های زبانی فعلی است.

در حالی که غول‌هایی مانند OpenAI، گوگل، متا و حتی چین و روسیه در حال رقابت برای ساخت نسل بعدی هوش مصنوعی (AGI) هستند، پروژه نیکلای دورف می‌تواند معادلات را تغییر دهد.

اگر پروژه نیکلای موفق شود، ما شاهد تولد هوش مصنوعی‌ای خواهیم بود که فقط «هوشمندانه صحبت نمی‌کند»، بلکه واقعاً می‌فهمد، فکر می‌کند و تصمیم می‌گیرد.
2🔥2🕊2
New Feature in Go 1.25 version 🤔
🎉18👍64🍾2🕊1
🔵 عنوان مقاله
Depot Ships Gocache v2 for 4x Faster Go Builds

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

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

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


👑 @gopher_academy
1
✍️Behnam Mohammadzadeh

اگر تو زبان Go عمیق شده باشین و سعی کرده باشین با نحوه عملکرد Scheduler آشنا بشین احتمالا Asynchronous Preemption به گوشتون خورده. تو این پست میخوام توضیح بدم که این اتفاق چطور میافته و نحوه عملکردش به چه شکله.

برای شروع شاید بد نباشه که بدونیم asynchronous preemption برای چی به وجود اومد و اصلا چه مشکلی رو حل میکنه؛ به همین منظور با یه مثال پیش میرم.

زمانی که GC میخواد اجرا بشه نیاز به (STW)Stop the World داره که تو این وضعیت باید همه گوروتین ها تو یه safe point متوقف بشن؛ کال شدن فانکشن یک safe point هست که گوروتین در این نقطه میتونه متوقف بشه تا GC کارش رو بدرستی انجام بده. ولی بعضی از گوروتین ها ممکنه موقع اجرا اصلا فانکشن کال نداشته باشن که به این حالت میگن tight loop.

تو این حالت گوروتین وقتی ۱۰ میلی ثانیه اجرا شد یه ترد به اسم sysmon که همیشه بصورت مستقل اجرا میشه میاد تشخیص میده که فلان گوروتین زیادی داره اجرا میشه و باید متوقف بشه تا نوبت به بقیه هم برسه و برای اینکه اون گوروتین رو متوقف کنه یه سیگنال SIGURG میفرسته.
از اونطرف یه گوروتین به اسم gSignal که هر ترد(M) یکی مخصوص خودش رو داره و میاد این سیگنال‌ها رو دریافت و هندل می‌کنه .

وقتی gSignal میبینه سیگنال دریافتی از نوع SIGURG هست متوجه میشه که باید preemption اتفاق بیافته و میاد چک میکنه که آیا این اتفاق باید بیافته یا نه؟ (از لینک پایین هم میتونید این فانکشن رو ببینید)
https://lnkd.in/d-cad4-C

بعدش میاد چک کنه ببینه که اگه preempt کنیم مشکلی پیش میاد یا نه؟ پس این فانکشن رو کال میکنه
https://lnkd.in/d5HV8Sh9

دلیلش هم اینه که ممکنه این گوروتین در حال کال کردن بعضی از فانکشن های runtime باشه که نباید وسط اجرای اون فانکشن ها preemption اتفاق بیافته؛ و همچنین چک میکنه ببینه stack فضای کافی داره یا نه(چون مرحله بعد بهش نیاز داره).
حالا که به یه safe point رسیدیم میاد و کار خفن اصلی رو انجام میده.


همونطور که قبلا دیدیم tight loop هیچ فانکشن کالی نداره! پس چجوری باید گوروتین رو مجبور به اینکار کرد؟
جواب، پوش کردن یک function call instruction به stack frame و تغییر PC هست!


این فانکشن این کار رو انجام میده:
https://lnkd.in/dcReVmHt

این فانکشن اول میاد برای یک instruction جدید داخل stack frame جا باز میکنه و بعد رجیسترهای RSP و RIP رو دستکاری میکنه تا PC به asyncPreempt تغییر کنه و بعد از اینکه اون اجرا شد کد قبلی بطور نرمال مثل گذشته به کارش ادامه بده.

لینک پست در ویرگول:
https://vrgl.ir/CLOKC
3
اصطلاح STW یا Stop The World یکی از مفاهیم مهم در پیاده‌سازی Garbage Collector (GC) در زبان‌هایی مثل Go، Java و… هست. در ادامه با جزییات کامل بهش می‌پردازیم:

---

تعریف STW (Stop The World)

STW به وضعیتی در اجرای برنامه گفته می‌شه که اجرای تمام گوروتین‌ها (یا تردها) متوقف می‌شن تا Garbage Collector بتونه کار خودش رو انجام بده.

> به زبان ساده: GC می‌گه «همه وایسید! من باید حافظه رو مرتب کنم».

---

📦 چرا GC نیاز به STW داره؟

Garbage Collector برای اینکه بتونه حافظه‌ی بدون استفاده رو شناسایی و آزاد کنه، باید بدونه که:

* چه آبجکت‌هایی در حال حاضر در دسترس هستن (reachable)
* چه آبجکت‌هایی دیگه استفاده نمی‌شن (unreachable)

برای اینکه بتونه این بررسی رو دقیق انجام بده، باید:

* بررسی کنه که stack و heap در هر گوروتین در چه حالتی هستن
* مطمئن باشه که گوروتین‌ها در نقطه‌ای امن (safe point) قرار دارن، یعنی وسط نوشتن یا تغییر داده‌ای نیستن که باعث اشتباه در تحلیل بشه.

---

🧩 Safe Point یعنی چی؟

Safe point به جایی از اجرای کد گفته می‌شه که:

* وضعیت حافظه کاملاً قابل پیش‌بینیه
* گوروتین در حال اجرای عملیات بحرانی نیست
* GC می‌تونه بدون نگرانی از race condition، وضعیت حافظه رو بررسی و اصلاح کنه

مثلاً:

* موقع فراخوانی تابع
* موقع خروج از تابع
* قبل یا بعد از تخصیص حافظه

---

⚙️ فرآیند STW چطوری کار می‌کنه در Go؟

1. GC تصمیم می‌گیره که وقت پاک‌سازی حافظه‌ست.
2. سیگنالی به تمام گوروتین‌ها می‌ده که باید به safe point برن.
3. وقتی همه گوروتین‌ها به safe point رسیدن، برنامه وارد حالت STW می‌شه:

* هیچ کدی (حتی گوروتین‌ها) اجرا نمی‌شن
4. GC با خیال راحت تحلیل حافظه (mark and sweep یا mark and compact) انجام می‌ده.
5. بعد از اتمام کار GC، گوروتین‌ها ادامه‌ی اجرای خودشون رو از سر می‌گیرن.

---

🕐 STW در Go چقدر طول می‌کشه؟

در نسخه‌های جدید Go (مثلاً Go 1.18 به بعد):

* STW بسیار کوتاهه (در حد microsecond)
* Go از تکنیک‌های پیشرفته مثل concurrent GC استفاده می‌کنه تا اکثر مراحل GC هم‌زمان با اجرای برنامه انجام بشن
* فقط بخش‌هایی مثل شروع و پایان GC نیاز به STW دارن

---

🎯 چرا STW ممکنه مشکل‌ساز بشه؟

اگر STW طولانی بشه:

* زمان پاسخ‌دهی (latency) سیستم زیاد می‌شه
* در اپلیکیشن‌های real-time یا interactive مثل گیم یا APIهای حساس، این تاخیر ممکنه قابل‌تحمل نباشه
* در برنامه‌های بزرگ با حافظه زیاد، ممکنه pauseها محسوس بشن
3
برای دیدن نمودار و لاگ‌های واقعی اجرای GC در برنامه Go (و بررسی دقیق زمان‌های STW)، می‌تونید از ابزارهای داخلی خود Go استفاده کنید..

🔧 مرحله 1: فعال‌سازی لاگ GC در Go

برای گرفتن لاگ دقیق GC، برنامه‌ات رو با تنظیم متغیر GODEBUG اجرا کن:

GODEBUG=gctrace=1 ./your_program


یا اگه داخل کد می‌خوای فعال کنی:

import "runtime/debug"

func main() {
debug.SetGCPercent(100) // یا مقدار دلخواه
// بقیه کدها
}


---

📜 نمونه لاگ واقعی GC در Go:

مثال خروجی لاگ با GODEBUG=gctrace=1:

gc 1 @0.004s 8%: 0.48+1.5+0.015 ms clock, 1.4+0.72/1.8/0+0.045 ms cpu, 4->4->2 MB, 5 MB goal, 4 P


🧩 تحلیل این لاگ:

| gc 1 | شمارنده اجرای GC (این بار اولیه) |

| @0.004s | زمان اجرای GC (۴ میلی‌ثانیه بعد از شروع برنامه) |

| 8% | درصد زمانی که GC نسبت به زمان اجرای برنامه گرفته |

| 0.48+1.5+0.015 ms clock | ۳ فاز GC به ترتیب: STW شروع + Marking (concurrent) + STW پایان |

| 1.4+0.72/1.8/0+0.045 ms cpu | مصرف CPU در مراحل مختلف |

| 4->4->2 MB | حجم heap قبل، بعد از marking، بعد از sweep |

| 5 MB goal | هدف بعدی برای heap |

| 4 P | تعداد پردازنده‌های منطقی (GOMAXPROCS) |

---

📊 مرحله 2: گرفتن نمودار GC (با pprof)

1. اضافه کردن HTTP profiling:

import _ "net/http/pprof"
import "net/http"

go func() {
http.ListenAndServe("localhost:6060", nil)
}()


2. اجرای برنامه و گرفتن پروفایل GC:

در ترمینال جدید:

go tool pprof http://localhost:6060/debug/pprof/heap


یا برای لاگ GC دقیق‌تر:

go tool pprof -http=:8080 http://localhost:6060/debug/pprof/goroutine


سپس داخل مرورگر: http://localhost:8080
می‌تونی نمودارهای flamegraph، timeline و heap را ببینی.

---

خلاصه

| GODEBUG=gctrace=1 | لاگ دقیق از اجرای GC و زمان STW |
| runtime/pprof + net/http/pprof | ساختن پروفایل‌های گرافیکی |
| go tool pprof | بررسی گرافیکی یا CLI لاگ‌ها و ساخت flamegraph |
| debug.SetGCPercent | تنظیم حساسیت GC |
5🍾1
🔵 عنوان مقاله
Open Source Outbound Webhooks Infrastructure

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

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

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


👑 @gopher_academy
1🔥1🍾1
🔵 عنوان مقاله
😅 (Ab)using Channels to Implement a 3D Pipe Game

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

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

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


👑 @gopher_academy
3🍾1
🔴قابلیت Anti‑CSRF protection ویژگی های جدید گولنگ نسخه 1.25

در Go 1.25، قابلیت جدیدی با نام Anti‑CSRF protection (محافظت در برابر CSRF) از طریق نوع جدید `http.CrossOriginProtection` معرفی شده است. این ویژگی بدون نیاز به توکن یا کوکی اضافی، حملات CSRF را با استفاده از اطلاعات Fetch metadata مرورگر مهار می‌کند.

---

🧠 چطوری کار می‌کنه؟

* این محافظ درخواست‌های ناامن cross-origin را بلاک می‌کند**، خصوصاً برای متدهایی مثل `POST`, `PUT`, یا `DELETE`
* با استفاده از هدر `Sec-Fetch-Site` برای تشخیص اینکه درخواست واقعاً متعلق به دامنه میزبان است یا خیر
* در صورتی که این هدر موجود نباشد، از هدر `Origin` استفاده می‌کند و آن را با `Host` مقایسه می‌کند ([
tip.golang.org][1], [antonz.org][2])
* متدهای `GET`, `HEAD` و `OPTIONS` همیشه مجاز هستند چون تغییر حالت سرور محسوب نمی‌شن


💻 مثال کاربردی


``` go
package main

import (
"io"
"log"
"net/http"
)

func main() {
mux := http.NewServeMux()
mux.HandleFunc("/get", func(w http.ResponseWriter, req *http.Request) {
io.WriteString(w, "GET ok\n")
})
mux.HandleFunc("/post", func(w http.ResponseWriter, req *http.Request) {
io.WriteString(w, "POST ok\n")
})

anti := http.NewCrossOriginProtection()
anti.AddTrustedOrigin("
https://example.com")
anti.AddTrustedOrigin("https://*.
example.com")

srv := &http.Server{
Addr: ":8080",
Handler: anti.Handler(mux),
}
log.Fatal(srv.ListenAndServe())
}
```

🧪 رفتارها:
درخواست محلی معتبر
:


  curl -X POST http://localhost:8080/post \
-H "sec-fetch-site:same-origin"


→ خروجی: POST ok

* درخواست cross-origin با هدر sec-fetch-site اشتباه:


  curl -X POST http://localhost:8080/post \
-H "sec-fetch-site:cross-site"


→ پاسخ: cross-origin request detected from Sec-Fetch-Site header

* درخواست Origin متفاوت از Host و بدون sec-fetch-site:


  curl -X POST http://localhost:8080/post \
-H "origin:https://evil.com" \
-H "host:localhost"


→ پاسخ: cross-origin request detected, and/or browser is out of date: Sec-Fetch-Site is missing, and Origin does not match Host

* درخواست از یک origin مورد اعتماد:


  curl -X POST http://localhost:8080/post \
-H "origin:https://example.com" \
-H "host:localhost"


→ خروجی: POST ok

* درخواست GET از هر origin:


  curl http://localhost:8080/get \
-H "origin:https://evil.com"


→ خروجی: GET ok

---

جمع‌بندی

| 💡 استفاده آسان | فقط wrap کردن http.Handler با CrossOriginProtection |

| 🔐 بدون توکن اضافی | با استفاده از داده‌های Fetch metadata |

| 🔄 فعال‌سازی برای همه non-safe متدها | به‌صورت پیش‌فرض |

| 🎯 امکان تعریف originهای قابل‌اعتماد | با AddTrustedOrigin |

| 🧭 پشتیبانی مرورگرهای مدرن و fallback برای مرورگرهای قدیمی | استفاده از Origin در صورت نبود Sec-Fetch-Site |
2🍾1
🔴قابلیت FlightRecorder ویژگی های جدید گولنگ نسخه 1.25

در Go نسخه 1.25، ویژگی جدیدی به نام FlightRecorder در پکیج `runtime/trace` معرفی شده
ابزاری سبک برای ثبت رخدادهای اخیر اجرای برنامه، بدون نیاز به فعال بودن کامل `trace` در تمام مدت.

---

🧠 این FlightRecorder چیه؟

📌 به‌صورت خلاصه:

* یک (circular buffer)
برای traceهای اجرا است.
* همیشه در پس‌زمینه اجرا می‌شود، اما فقط داده‌های اخیر را نگه می‌دارد.
* زمانی که نیاز داری (مثلاً هنگام خطا یا کندی)، می‌تونی trace لحظه‌ای رو ازش دریافت کنی.

این ویژگی برای debug کردن اتفاقاتی که چند ثانیه قبل از یک مشکل رخ داده‌اند بسیار مفیده.

---

⚙️ چطور کار می‌کنه؟

1. ابتدا trace.NewFlightRecorder(config) را می‌سازیم.
2. و rec.Start() را فراخوانی می‌کنیم.
3. برنامه اجرا می‌شود و FlightRecorder رخدادهای اخیر را ذخیره می‌کند.
4. در لحظه‌ای خاص (مثلاً هنگام خطا)، می‌تونیم trace را در فایل بنویسیم با rec.WriteTo().

---

مثال کامل:

package main

import (
"fmt"
"log"
"os"
"runtime/trace"
"time"
)

func main() {
// ۱. پیکربندی Recorder
cfg := trace.FlightRecorderConfig{
MinAge: 5 * time.Second, // حداقل مدت نگهداری اطلاعات
MaxBytes: 3 << 20, // 3 مگابایت بافر
}

rec := trace.NewFlightRecorder(cfg)

// ۲. شروع ضبط
if err := rec.Start(); err != nil {
log.Fatal(err)
}
defer rec.Stop()

// ۳. شبیه‌سازی اجرای برنامه
fmt.Println(" برنامه در حال اجراست...")
time.Sleep(7 * time.Second) // این زمان trace می‌شود

// ۴. ذخیره trace هنگام رخداد خاص
f, _ := os.Create("flight.out")
defer f.Close()

if n, err := rec.WriteTo(f); err != nil {
log.Fatal(" خطا در نوشتن trace:", err)
} else {
fmt.Printf(" trace نوشته شد (%d bytes)\n", n)
}
}


🔍 بررسی trace

برای مشاهده خروجی .out:

go tool trace flight.out


یک رابط گرافیکی در مرورگر باز می‌شود که:

* goroutineها
* block/wait
* garbage collection
* system callها
* و delayها را نمایش می‌دهد.

---

🟢 مزایا

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

| برای production مناسب | نیاز به فعال‌سازی trace کامل نیست. |

| ابزار عالی برای تحلیل post-mortem | مخصوصاً وقتی crash یا slowdown بدون هشدار قبلی رخ داده. |

| کاملاً سازگار با `go tool trace` | بدون نیاز به ابزار جدید. |
7
🔵 عنوان مقاله
How to Manage Configuration Settings in Go Webapps

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

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

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


👑 @gopher_academy
3
Forwarded from 𓄂 Bardia 𓆃
🤖 علاقه‌مند به دنیای هوش مصنوعی هستی؟

دنبال می‌کنی که چطور AI داره دنیا رو متحول می‌کنه؟

پس جای درستی اومدی!

🎯 در کانال ما هر روز:

🔍 جدیدترین اخبار و دستاوردهای دنیای AI

🧠 تحلیل‌ تخصصی در حوزه یادگیری ماشین، دیپ لرنینگ و مدل‌های زبانی

💼 بررسی کاربردهای هوش مصنوعی در پزشکی، صنعت، آموزش، امنیت و اقتصاد

🛠 معرفی ابزارها، دوره‌ها و منابع یادگیری

📈 بررسی ترندها و آینده‌ فناوری‌های مرتبط با هوش مصنوعی

همه‌ی این‌ها به زبان ساده، خلاصه و قابل فهم برای همه علاقه‌مندان — از مبتدی تا حرفه‌ای


👇👇👇👇👇


https://t.me/ai_labdon
2
🔵 عنوان مقاله
Fix Go Bugs and Bottlenecks Fast with AppSignal

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

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

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


👑 @gopher_academy
2
🔴قابلیت sync.WaitGroup ویژگی های جدید گولنگ نسخه 1.25

در نسخه Go 1.25**، یک متد جدید به `sync.WaitGroup` اضافه شده به نام Go()** که هدفش ساده‌سازی اجرای goroutineها همراه با شمارنده‌ی WaitGroup است.

🧠 چرا WaitGroup.Go() اضافه شده؟

در نسخه‌های قبلی برای اجرای goroutine همراه با شمارنده WaitGroup`، باید دستی `Add() و Done() را بنویسید:

روش قدیمی:

var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
doWork()
}()


اگر Add یا Done را فراموش می‌کردی یا ترتیبش اشتباه بود، ممکن بود برنامه بن‌بست (deadlock) بشه یا goroutineها نشمارده بشن.

---

روش جدید: wg.Go(fn)

در Go 1.25، این الگو ساده شده:

var wg sync.WaitGroup
wg.Go(func() {
doWork()
})


هم‌زمان Add(1) انجام می‌شه و داخل goroutine به‌طور خودکار Done() صدا زده می‌شه—دیگه لازم نیست دستی چیزی بنویسی.


مثال کامل

package main

import (
"fmt"
"sync"
)

func main() {
var wg sync.WaitGroup

for i := 0; i < 3; i++ {
i := i // capture variable
wg.Go(func() {
fmt.Println("working on task", i)
})
}

wg.Wait()
fmt.Println("All tasks done.")
}


خروجی ممکن:

working on task 0
working on task 1
working on task 2
All tasks done.



📌 مزایای Go()

| مزیت | توضیح |
| -------------------------------------- | ---------------------------- |
| کد تمیزتر | نیازی به Add و Done نیست |
| 🧠 جلوگیری از خطاهای رایج | مثل فراموشی Done() |
| 🧵 مناسب برای patternهای goroutine سبک | موازی‌سازی سریع و امن |

---

⚠️ نکته مهم

* Go() فقط از Go 1.25 در دسترس است.
* برای استفاده از آن، باید مطمئن باشید که پروژه‌تان با Go 1.25 یا بالاتر کامپایل می‌شود.
* این متد دقیقاً مثل go func(){...}() عمل می‌کند، فقط با مدیریت داخلی Add و Done.
👍43🔥3🎉1
Forwarded from Software Engineer Labdon
فهرستی ارزشمند برای برنامه‌نویسان حرفه‌ای. مناسب برای توسعه‌دهندگان بک‌اند، فرانت‌اند، دواپس و برنامه‌نویسان عمومی.

https://github.com/charlax/professional-programming
🍾3🔥1
🔵 عنوان مقاله
🎨 Colorspace: Color Space Conversion Library

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

این مقاله با بررسی فضاهای رنگی مختلف مانند sRGB و sRGB خطی، فضای رنگی CIE XYZ و فضاهای رنگی نوظهور OKLAB و OKLCH به بررسی پیشرفت‌ها در تکنیک‌های دستکاری رنگ می‌پردازد. هدف از این بررسی‌ها، بهبود تبدیل‌های رنگی و ایجاد امکان تنظیمات رنگی دقیق‌تر است. به خصوص، فضاهای رنگی جدید مانند OKLAB و OKLCH، به منظور تسهیل در اجرای تغییرات رنگی منظم و دقیق‌تر، طراحی شده‌اند. این مقاله تاثیرات آن‌ها را در مدیریت رنگ دیجیتال و طراحی گرافیک به تصویر می‌کشد.

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


👑 @gopher_academy
👍1
🔴قابلیت Cloner ویژگی های جدید گولنگ نسخه 1.25

در Go 1.25**، رابط جدیدی در بسته `hash` معرفی شده با نام Cloner که به انواع `hash.Hash` اجازه می‌دهد **وضعیت داخلی (state) خود را کپی کند. این برای مواقعی بسیار مفید است که بخواهید از یک هش، مقدار میانی را ذخیره کرده و ادامه دهید، بدون آنکه کل روند هش را دوباره اجرا کنید.

---

🧠این hash.Cloner چیست؟

رابط ساده زیر را دارد:

type Cloner interface {
Clone() Hash
}


این متد وضعیت داخلی هش فعلی را کپی کرده و یک نمونه‌ی مستقل جدید از همان نوع (Hash) بازمی‌گرداند. تمام پیاده‌سازی‌های استاندارد Go مثل hash/maphash این رابط را پیاده‌سازی کرده‌اند. ([tip.golang.org][1])

---

🔧 چرا مفید است؟

* صرفه‌جویی در زمان و CPU: کپی وضعیت داخلی، نیاز به محاسبه مجدد هش را حذف می‌کند.
* سازگاری با الگوریتم‌های ترکیبی: وقتی می‌خواهید چند هش متفاوت را روی یک دنباله شروع کرده و بعداً ادامه دهید.
* کاربرد در HMAC، Merkle‑Tree، بررسی تکرارشونده بودن داده‌ها.

---

مثال کاربردی

فرض کنید می‌خواهیم هش SHA256 بسازیم تا داده‌ها را در چند مرحله هش کنیم، ولی بخشی آغازین مشترک دارند:

package main

import (
"crypto/sha256"
"fmt"
"hash"
)

func main() {
base := []byte("header")

h1 := sha256.New()
h1.Write(base) // وضعیت میانی

// کپی وضعیت هش
h2 := h1.(interface{ Clone() hash.Hash }).Clone()

// ادامه روی نسخه اول
h1.Write([]byte(" payload1"))
sum1 := h1.Sum(nil)

// ادامه روی نسخه دوم
h2.Write([]byte(" payload2"))
sum2 := h2.Sum(nil)

fmt.Printf("sum1: %x\n", sum1)
fmt.Printf("sum2: %x\n", sum2)
}


📌 *پویا بودن نوع Cloner*: در runtime هش شونده است و نیاز به import "hash" است.

---

⚖️ نکات

* نوع برگشتی دقیقاً همان نوع هش است؛ بدون downcast اضافی.
* هیچ اثر جانبی روی هش اصلی ندارد.
* متد روند هش را متوقف می‌کند و وضعیت فعلی را مکان جداگانه ذخیره می‌نماید.

---

🧭 جمع‌بندی

*این `hash.Cloner` در Go 1.25 به hash.Hash امکان می‌دهد وضعیت داخلی خودش را کپی کند.
* با Clone() می‌توانید چند ریزه‌کاری هش را از همان نقطه شروع ادامه دهید—بدون محاسبه دوباره.
* برای ساخت هش‌های موازی، HMAC یا الگوریتم‌هایی با بخش مشترک واقعاً کاربردی است.
7
🔴قابلیت reflect.TypeAssert ویژگی های جدید گولنگ نسخه 1.25

در Go نسخه 1.25 یک تابع جدید در پکیج `reflect` به نام `reflect.TypeAssert` معرفی شده که به شکل زیر تعریف می‌شود:

func TypeAssert[T interface{}](v reflect.Value) (T, bool)


این تابع اجازه می‌دهد مستقیماً از یک reflect.Value به نوع مشخص T تبدیل شویم، به همان روشی که با type assertion در interface ها انجام می‌دهیم، اما با کارایی بهتر**—بدون تخصیص حافظه اضافیٔ `interface{}` و تبدیل مجدد به یک مقدار Go معمولی ([tip.golang.org][1]).

---

🧠 چرا `TypeAssert` مهمه؟

وقتی از روش قدیمی استفاده می‌کنیم:

```go
val := v.Interface().(MyType)
```

ابتدا آدرس حافظه برای `interface{}` ساخته می‌شود، سپس assertion انجام می‌شود—که ممکن است تخصیص حافظه ناخواسته انجام بدهد.

با `reflect.TypeAssert` داریم:

* **مستقیماً
از reflect.Value به MyType.
* بدون ساختن interface{} موقتی.
* سریع‌تر و کم‌هزینه‌تر.

---

## مثال عملی

package main

import (
"fmt"
"reflect"
)

type Person struct {
Name string
Age int
}

func main() {
p := Person{"Alice", 30}
v := reflect.ValueOf(p)

// تبدیل مستقیم با TypeAssert
if val, ok := reflect.TypeAssert[Person](v); ok {
fmt.Printf("شد! نام: %s، سن: %d\n", val.Name, val.Age)
} else {
fmt.Println("نوع مطابقت ندارد")
}

// مثالی برای نوع اشتباه
if val, ok := reflect.TypeAssert[*Person](v); ok {
fmt.Println("این کار نمیشه:", val)
} else {
fmt.Println("اشتباه: v اصلاً *Person نیست")
}
}


### خروجی:

شد! نام: Alice، سن: 30
اشتباه: v اصلاً *Person نیست




---

جمع‌بندی

*این reflect.TypeAssert[T] راهی کارا و تیپ‌-محور برای بازیابی مقدار Go از reflect.Value است.
* بدون overhead ای که تبدیل به interface{} ایجاد می‌کند.
* مناسب برای مواردی که در reflection با performance حساس کار می‌کنید.
5🔥1
🔵 عنوان مقاله
Build Containers from Scratch

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

فهمیدن مکانیزم‌های پایه‌ای کانتینرها با استفاده از ابزارهای اولیه لینوکس مانند chroot، فضا‌های نام و cgroups ضروری است. این ابزارها به تعیین محیط‌های جداگانه و مدیریت منابع برای فرآیندها کمک می‌کنند. پس از آن، با استفاده از Docker می‌توان کانتینرها را به‌راحتی ساخت و با Kubernetes آن‌ها را مدیریت و به کار گرفت. Docker و Kubernetes به افزایش قابلیت‌های استفاده مجدد و مدیریت بهینه منابع در محیط‌های تولیدی کمک می‌کنند.

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


👑 @gopher_academy
3🔥1
Forwarded from AI Labdon
🤖 همه‌چیز درباره Grok 4 – نزدیک‌ترین مدل به AGI (مدل انسانی)


🔸 قدرت پردازش: گراک ۴ با ۱۰۰ برابر قدرت بیشتر نسبت به Grok 2 آموزش دیده و نصف تاخیر (Latency) گراک ۳ رو داره.

🔸 دسترسی: احتمالاً نسخه Grok 3 به‌زودی برای دانلود عمومی در دسترس قرار می‌گیره.

📈 بنچمارک AGI:
تو بنچمارک بسیار دشوار ARC-AGI که ماه‌ها هیچ مدلی نتونسته بود حتی از مرز ۱۰٪ عبور کنه، گراک ۴ تونست در کمتر از ۱۲ ساعت به امتیاز ۱۵.۸٪ برسه؛ یک رکورد جدید!

📚 آزمون‌های علمی:
در آزمون HLE با ۲۵۰۰ سؤال در سطح دکترا:

Grok 4: امتیاز %25.4

میانگین انسان‌ها: 5%

Gemini 2.5 Pro: %امتیاز 21.6
OpenAI o3-high: %امتیاز 21

Grok 4 Heavy:
امتیاز عجیب و چشمگیر بیش از ۵۰ درصد


🧠 دیدگاه ماسک:

ایلان ماسک گفته: «دانشجوهای دکترا تو آزمون‌هایی که گراک قبول می‌شه، رد می‌شن!»


🚀 نسخه Heavy:
مدلی با اسم الهام‌گرفته از Falcon Heavy، که یک مدل مولتی‌ایجنته.
ماسک می‌گه وقتی یه سوال پیچیده ازش بپرسید، به‌جای یک جواب مستقیم، چندین ایجنت با هم مثل یه «تیم مطالعه» همکاری می‌کنن تا به بهترین پاسخ برسن.

🧾قیمت API:
پنجره زمینه: تا ۲۵۶ هزار توکن (عالی برای اسناد حجیم)

قیمت:
ورودی: ۳ دلار / یک میلیون توکن
خروجی: ۱۵ دلار / یک میلیون توکن

👇👇👇👇👇👇👇👇👇
@ai_labdon
🔥2