Gopher Academy
3.33K subscribers
915 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
🔵 عنوان مقاله
😅 (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 & Erfan
🤖 علاقه‌مند به دنیای هوش مصنوعی هستی؟

دنبال می‌کنی که چطور 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
🔵 عنوان مقاله
Minimock: A Tool to Generate Mocks from Interface Declarations

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

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

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


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

در نسخه Go 1.25**، ویژگی جدیدی به پکیج `log/slog` اضافه شده به نام slog.GroupAttrs که برای **ساخت گروه‌بندی‌شده‌ی Attributeها در لاگ‌ها استفاده می‌شود. این ویژگی باعث می‌شود لاگ‌های شما ساختاریافته‌تر، قابل‌خواندن‌تر، و بهتر برای پردازش توسط ابزارهای خارجی (مثل ELK، Loki، Datadog) باشند.

---

🧠ویزگی slog.GroupAttrs چیه؟

func GroupAttrs(key string, attrs ...Attr) Attr


این تابع یک attribute با کلید key و مقدار یک زیرگروه از attributeها می‌سازه. معادل چیزی شبیه به JSON زیر هست:

{
"user": {
"id": 123,
"email": "alice@example.com"
}
}


---

مثال عملی

package main

import (
"log/slog"
"os"
)

func main() {
logger := slog.New(slog.NewTextHandler(os.Stdout, nil))

logger.Info("user logged in",
slog.GroupAttrs("user",
slog.Int("id", 42),
slog.String("email", "user@example.com"),
),
slog.String("ip", "192.168.1.1"),
)
}


🖨 خروجی (به‌صورت متنی):

time=2025-06-15T14:00:00Z level=INFO msg="user logged in" user.id=42 user.email=user@example.com ip=192.168.1.1


📦 در حالت JSON:

{
"time": "...",
"level": "INFO",
"msg": "user logged in",
"user": {
"id": 42,
"email": "user@example.com"
},
"ip": "192.168.1.1"
}


---

🔄 مقایسه با قبل از Go 1.25

در نسخه‌های قبلی، باید از slog.Group() استفاده می‌کردی که کمی verbose بود و در هندلرهای custom گاهی نیاز به دست‌کاری دستی داشت. حالا slog.GroupAttrs دقیقاً برای این هدف به‌شکل ساده‌سازی‌شده اضافه شده.

---

## جمع‌بندی

*این slog.GroupAttrs روشی ساده و تمیز برای لاگ کردن داده‌های گروه‌بندی‌شده است.
* ساختار لاگ شما را به شکل JSON درختی درمی‌آورد (برای پردازش، ذخیره و تحلیل بهتر).
* کار کردن با ابزارهای log aggregation را بسیار ساده‌تر می‌کند.
* در پلتفرم‌هایی مثل Grafana Loki, Datadog, یا Cloud Logging ساختار لاگ‌ها خواناتر و قابل فیلتر است.
🔥6
🔴قابلیت os.Root ویژگی های جدید گولنگ نسخه 1.25

ویژگی جدید os.Root در Go 1.25 همچنان همان نوعی است که در Go 1.24 معرفی شد، ولی در نسخه 1.25 روش‌های جدیدی برای تعامل با فایل‌ها اضافه شده تا استفاده و ایمنی آن ساده‌تر شود

🛡این os.Root چیه؟

این os.Root اجازه میده عملیات فایل را به یک دایرکتوری مشخص محدود کنید.
با این کار، حتی اگر مسیرهایی مثل ../../secret.txt استفاده شود،
دسترسی به بیرون از ریشه os.Root امکان‌پذیر نیست
— این کمک بزرگی در مقابله با حملات Path Traversal است .

برای ایجاد آن:

root, err := os.OpenRoot("data")
if err != nil {
log.Fatal(err)
}


بعداً می‌توان از root به‌جای os برای باز کردن، نوشتن یا پاک کردن فایل‌ها استفاده کرد.

---

⚙️ توسعه در Go 1.25: متدهای جدید

در نسخه 1.25، متدهایی مشابه آنچه در os وجود داشت به os.Root اضافه شده‌اند تا کار با آن کامل شود
— دیگر لازم نیست دائماً تابع‌های عمومی را صدا بزنید، بلکه:

* `root.Chmod(path, mode)`
* `root.Chown(path, uid, gid)`
* `root.Chtimes(path, atime, mtime)`
* `root.Link(oldpath, newpath)`
* `root.MkdirAll(path, perm)`
* `root.RemoveAll(path)`
* `root.Rename(old, new)`
* `root.Symlink(old, new)`, `root.Readlink(path)`
* `root.WriteFile(name, data, perm)`
* `root.ReadFile(name)`

این متدها باعث ساده‌تر و ایمن‌تر شدن استفاده از os.Root می‌شوند.

---

## 📝 مثال واقعی

package main

import (
"fmt"
"log"
"os"
"time"
)

func main() {
root, err := os.OpenRoot("data")
if err != nil {
log.Fatal(err)
}

// ایجاد دایرکتوری
if err := root.MkdirAll("nested/dir", 0750); err != nil {
log.Fatal(err)
}

// نوشتن در فایل
msg := []byte("hello Go!")
if err := root.WriteFile("nested/dir/file.txt", msg, 0644); err != nil {
log.Fatal(err)
}

// تغییر زمان دسترسی و تغییر فایل
at := time.Now()
mt := time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC)
if err := root.Chtimes("nested/dir/file.txt", at, mt); err != nil {
log.Fatal(err)
}

// خونده و چاپ محتوا
content, err := root.ReadFile("nested/dir/file.txt")
if err != nil {
log.Fatal(err)
}
fmt.Printf("Content: %s\n", content)

// پاک‌سازی همه چیز
if err := root.RemoveAll("nested"); err != nil {
log.Fatal(err)
}

fmt.Println("Done")
}


نکات ایمنی

* تمام این عملیات فقط در داخل دایرکتوری data اتفاق می‌افتد؛ تلاش برای دسترسی به بیرون، خطا خواهد داد.
* حمله‌هایی مثل file := "../etc/passwd" مؤثر نیستند.
* در نسخه‌های قبل از 1.24، چنین قابلیت امنیتی به‌صورت ابتدایی وجود نداشت.

---

جمع‌بندی

* این os.Root در Go 1.25 متدهای قدرتمندی برای کار با فایل‌ها اضافه کرده است تا توسعه‌دهنده بتواند در داخل یک ریشه مشخص و ایمن عملیات انجام دهد.
* با وجود این متدها، کار با فایل‌ها ساده‌تر، خواناتر و امن‌تر شده و آسیب‌پذیری‌های مربوط به دسترسی تصادفی یا ناخواسته حذف شده‌اند.
🔥4
Forwarded from Bardia & Erfan
🍾5👍3🕊2
🔵 عنوان مقاله
go-ytdlp: yt-dlp CLI Bindings for Go

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

yt-dlp یک ابزار دانلود چندرسانه‌ای محبوب است که نه تنها برای یوتیوب بلکه برای صدها پلتفرم دیگر کاربرد دارد. این ابزار به کاربران امکان می‌دهد تا به راحتی محتوای صوتی و تصویری را از وب‌سایت‌های مختلف دانلود کنند و از ویژگی‌هایی نظیر انتخاب کیفیت ویدئو، استخراج صدا از ویدئوها، دانلود لیست‌ پخش کامل، و مدیریت پخش زنده بهره‌مند است. این ابزار، که توسط جامعه‌ای از توسعه‌دهندگان به طور مداوم به‌روزرسانی می‌شود، در بین کاربرانی که به دنبال دانلود محتوا هستند بسیار محبوب و کارآمد شناخته شده است.

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


👑 @gopher_academy
3👍3
🔵 عنوان مقاله
doWM: A Tiling and Floating Window Manager for X11

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

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

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


👑 @gopher_academy
1
🔴قابلیت `T.Attr`, `B.Attr`, و `F.Attr`. ویژگی های جدید گولنگ نسخه 1.25

در Go نسخه 1.25**، سه متد جدید به پکیج `testing` اضافه شده‌اند: `T.Attr`, `B.Attr`, و `F.Attr`. این‌ها به شما اجازه می‌دهند **اتریبیوت‌های دلخواه (کلید–مقدار) را مستقیماً به خروجی لاگ تست ارسال کنید.

---

🏷 چه کاری انجام می‌دهند؟

با استفاده از T.Attr(key, value) می‌توانید به‌سادگی یک attribute با کلید key و مقدار value اضافه کنید و این در لاگ تست خواهد آمد:

=== ATTR  TestMyFeat myKey someValue


* برای تست‌ها: از T.Attr
* برای بنچمارک‌ها: از B.Attr
* برای فریمورک‌های fuzzing: از F.Attr

---

چرا مفید هستند؟

* دنبال کردن metadata مرتبط با تست‌ها، مثل نسخه پکیج، وضعیت کانفیگ، داده‌های ورودی خاص
* مناسب برای تولید خروجی قابل‌پردازش با test2json
* واضح و مستقیم، بدون نیاز به استفاده از Log یا fmt

---

🌟 مثال ساده

package mypkg_test

import "testing"

func TestSomething(t *testing.T) {
t.Attr("db", "postgres")
t.Attr("featureFlag", "enabled")

t.Log("running test with attributes")
// ... انجام تست اصلی ...
}


خروجی هنگام اجرای go test:

=== RUN   TestSomething
=== ATTR TestSomething db postgres
=== ATTR TestSomething featureFlag enabled
mypkg_test.go:10: running test with attributes
--- PASS: TestSomething (0.00s)


---

📊 ترکیب با test2json

اگر خروجی را با go test -json یا test2json بگیرد، این اتریبیوت‌ها به‌صورت structured می‌روند و ابزارهای CI/CD یا داشبوردها می‌توانند آن‌ها را بخوانند.

---

🛠 مثال برای بنچمارک‌ها

func BenchmarkMyOp(b *testing.B) {
b.Attr("iterations", b.N)
for i := 0; i < b.N; i++ {
// عملیات اصلی ...
}
}


خروجی:

=== BENCH: BenchmarkMyOp
=== ATTR BenchmarkMyOp iterations 1000
...


---

جمع‌بندی

*این T.Attr (و معادل‌های آن برای benchmark/fuzz) روشی ساده برای اضافه کردن metadata به تست‌ها هستند.
* بهبود خوانایی لاگ و قابلیت تجزیه‌ی ساخت‌یافته در ابزارهای خودکار.
* بسیار سبک و بدون overhead، یک ویژگی جزئی ولی کاربردی برای ردیابی و دیباگ.
3