🔴قابلیت reflect.TypeAssert ویژگی های جدید گولنگ نسخه 1.25
در Go نسخه 1.25 یک تابع جدید در پکیج `reflect` به نام `reflect.TypeAssert` معرفی شده که به شکل زیر تعریف میشود:
این تابع اجازه میدهد مستقیماً از یک
---
🧠 چرا `TypeAssert` مهمه؟
وقتی از روش قدیمی استفاده میکنیم:
```go
val := v.Interface().(MyType)
```
ابتدا آدرس حافظه برای `interface{}` ساخته میشود، سپس assertion انجام میشود—که ممکن است تخصیص حافظه ناخواسته انجام بدهد.
با `reflect.TypeAssert` داریم:
* **مستقیماً از
* بدون ساختن
* سریعتر و کمهزینهتر.
---
## ✅ مثال عملی
### خروجی:
---
✅ جمعبندی
*این
* بدون overhead ای که تبدیل به
* مناسب برای مواردی که در reflection با performance حساس کار میکنید.
در 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
Build Containers from Scratch
🟢 خلاصه مقاله:
فهمیدن مکانیزمهای پایهای کانتینرها با استفاده از ابزارهای اولیه لینوکس مانند chroot، فضاهای نام و cgroups ضروری است. این ابزارها به تعیین محیطهای جداگانه و مدیریت منابع برای فرآیندها کمک میکنند. پس از آن، با استفاده از Docker میتوان کانتینرها را بهراحتی ساخت و با Kubernetes آنها را مدیریت و به کار گرفت. Docker و Kubernetes به افزایش قابلیتهای استفاده مجدد و مدیریت بهینه منابع در محیطهای تولیدی کمک میکنند.
🟣لینک مقاله:
https://golangweekly.com/link/171542/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Frontendmasters
Learn Containers from Scratch | Basics, Docker, Kubernetes
Get an introduction to containers from the ground up. Build a container by hand, then learn Docker, optimization, multi-container projects, and intro to Kubernetes.
❤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
🔸 قدرت پردازش: گراک ۴ با ۱۰۰ برابر قدرت بیشتر نسبت به 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
Telegram
AI Labdon
🕸 AI Labdon
بروز ترین مرجع خبری در مورد دنیایی هوش مصنوعی
حمایت مالی:
https://www.coffeete.ir/mrbardia72
ادمین:
@mrbardia72
بروز ترین مرجع خبری در مورد دنیایی هوش مصنوعی
حمایت مالی:
https://www.coffeete.ir/mrbardia72
ادمین:
@mrbardia72
🔥2
🔵 عنوان مقاله
Minimock: A Tool to Generate Mocks from Interface Declarations
🟢 خلاصه مقاله:
مقاله به بررسی ابزاری پیشرفته برای برنامهنویسان میپردازد که قابلیت تولید ماکها و کمککنندههای با نوعگذاری استاتیک و همچنین پشتیبانی از عمومیسازیها (ژنریکها) را داراست. این ابزار کاملاً با بسته آزمایشی ادغام شده و فرآیند تست نرمافزار را بهبود میبخشد، باعث افزایش کارایی و انعطافپذیری در تستها میشود.
🟣لینک مقاله:
https://golangweekly.com/link/171564/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Minimock: A Tool to Generate Mocks from Interface Declarations
🟢 خلاصه مقاله:
مقاله به بررسی ابزاری پیشرفته برای برنامهنویسان میپردازد که قابلیت تولید ماکها و کمککنندههای با نوعگذاری استاتیک و همچنین پشتیبانی از عمومیسازیها (ژنریکها) را داراست. این ابزار کاملاً با بسته آزمایشی ادغام شده و فرآیند تست نرمافزار را بهبود میبخشد، باعث افزایش کارایی و انعطافپذیری در تستها میشود.
🟣لینک مقاله:
https://golangweekly.com/link/171564/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
GitHub
GitHub - gojuno/minimock: Powerful mock generation tool for Go programming language
Powerful mock generation tool for Go programming language - gojuno/minimock
❤2
🔴قابلیت
در نسخه Go 1.25**، ویژگی جدیدی به پکیج `log/slog` اضافه شده به نام
---
🧠ویزگی
این تابع یک attribute با کلید
---
✅ مثال عملی
🖨 خروجی (بهصورت متنی):
📦 در حالت JSON:
---
🔄 مقایسه با قبل از Go 1.25
در نسخههای قبلی، باید از
---
## ✅ جمعبندی
*این
* ساختار لاگ شما را به شکل JSON درختی درمیآورد (برای پردازش، ذخیره و تحلیل بهتر).
* کار کردن با ابزارهای log aggregation را بسیار سادهتر میکند.
* در پلتفرمهایی مثل Grafana Loki, Datadog, یا Cloud Logging ساختار لاگها خواناتر و قابل فیلتر است.
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
🔴قابلیت
ویژگی جدید
🛡این
این
با این کار، حتی اگر مسیرهایی مثل
دسترسی به بیرون از ریشه
— این کمک بزرگی در مقابله با حملات Path Traversal است .
برای ایجاد آن:
بعداً میتوان از
---
⚙️ توسعه در Go 1.25: متدهای جدید
در نسخه 1.25، متدهایی مشابه آنچه در
— دیگر لازم نیست دائماً تابعهای عمومی را صدا بزنید، بلکه:
* `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)`
این متدها باعث سادهتر و ایمنتر شدن استفاده از
---
## 📝 مثال واقعی
نکات ایمنی
* تمام این عملیات فقط در داخل دایرکتوری
* حملههایی مثل
* در نسخههای قبل از 1.24، چنین قابلیت امنیتی بهصورت ابتدایی وجود نداشت.
---
✅ جمعبندی
* این
* با وجود این متدها، کار با فایلها سادهتر، خواناتر و امنتر شده و آسیبپذیریهای مربوط به دسترسی تصادفی یا ناخواسته حذف شدهاند.
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
🔵 عنوان مقاله
go-ytdlp: yt-dlp CLI Bindings for Go
🟢 خلاصه مقاله:
yt-dlp یک ابزار دانلود چندرسانهای محبوب است که نه تنها برای یوتیوب بلکه برای صدها پلتفرم دیگر کاربرد دارد. این ابزار به کاربران امکان میدهد تا به راحتی محتوای صوتی و تصویری را از وبسایتهای مختلف دانلود کنند و از ویژگیهایی نظیر انتخاب کیفیت ویدئو، استخراج صدا از ویدئوها، دانلود لیست پخش کامل، و مدیریت پخش زنده بهرهمند است. این ابزار، که توسط جامعهای از توسعهدهندگان به طور مداوم بهروزرسانی میشود، در بین کاربرانی که به دنبال دانلود محتوا هستند بسیار محبوب و کارآمد شناخته شده است.
🟣لینک مقاله:
https://golangweekly.com/link/171561/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
go-ytdlp: yt-dlp CLI Bindings for Go
🟢 خلاصه مقاله:
yt-dlp یک ابزار دانلود چندرسانهای محبوب است که نه تنها برای یوتیوب بلکه برای صدها پلتفرم دیگر کاربرد دارد. این ابزار به کاربران امکان میدهد تا به راحتی محتوای صوتی و تصویری را از وبسایتهای مختلف دانلود کنند و از ویژگیهایی نظیر انتخاب کیفیت ویدئو، استخراج صدا از ویدئوها، دانلود لیست پخش کامل، و مدیریت پخش زنده بهرهمند است. این ابزار، که توسط جامعهای از توسعهدهندگان به طور مداوم بهروزرسانی میشود، در بین کاربرانی که به دنبال دانلود محتوا هستند بسیار محبوب و کارآمد شناخته شده است.
🟣لینک مقاله:
https://golangweekly.com/link/171561/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
GitHub
GitHub - lrstanley/go-ytdlp: yt-dlp cli bindings for Go
yt-dlp cli bindings for Go. Contribute to lrstanley/go-ytdlp development by creating an account on GitHub.
❤3👍3
🔵 عنوان مقاله
doWM: A Tiling and Floating Window Manager for X11
🟢 خلاصه مقاله:
مقالهای معرفی شده است که درباره یک مدیر پنجره سریع و سبک که به طور کامل با زبان برنامهنویسی Go نوشته شده، بحث میکند. این مدیر پنجره میتواند به عنوان یک ورودی عالی برای کسانی که به لینوکس علاقهمند هستند و دارای پیشزمینه لازم در این زمینه هستند، استفاده شود تا بتوانند محیط کامپیوتری خود را سفارشیسازی کرده و آن را به شخصیسازی خود بپردازند. کد منبع و مستندات این مدیر پنجره در مخزن GitHub آن قابل دسترسی است.
🟣لینک مقاله:
https://golangweekly.com/link/171556/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
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`. اینها به شما اجازه میدهند **اتریبیوتهای دلخواه (کلید–مقدار) را مستقیماً به خروجی لاگ تست ارسال کنید.
---
🏷 چه کاری انجام میدهند؟
با استفاده از
* برای تستها: از
* برای بنچمارکها: از
* برای فریمورکهای fuzzing: از
---
✅ چرا مفید هستند؟
* دنبال کردن metadata مرتبط با تستها، مثل نسخه پکیج، وضعیت کانفیگ، دادههای ورودی خاص
* مناسب برای تولید خروجی قابلپردازش با
* واضح و مستقیم، بدون نیاز به استفاده از
---
🌟 مثال ساده
خروجی هنگام اجرای
---
📊 ترکیب با
اگر خروجی را با
---
🛠 مثال برای بنچمارکها
خروجی:
---
✅ جمعبندی
*این
* بهبود خوانایی لاگ و قابلیت تجزیهی ساختیافته در ابزارهای خودکار.
* بسیار سبک و بدون overhead، یک ویژگی جزئی ولی کاربردی برای ردیابی و دیباگ.
در 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
🎯 ویژگی های جدید گولنگ نسخه 1.25 رو از اینجا بخونید
🔵synctest
🟢https://t.me/gopher_academy/3910
▫️▪️▫️▪️▫️▪️▫️▪️▫️
🔵 json/v2
🟢https://t.me/gopher_academy/3913
▫️▪️▫️▪️▫️▪️▫️▪️▫️
🔵 Container-aware GOMAXPROCS
🟢https://t.me/gopher_academy/3922
▫️▪️▫️▪️▫️▪️▫️▪️▫️
🔵New GC
🟢 https://t.me/gopher_academy/3925
▫️▪️▫️▪️▫️▪️▫️▪️▫️
🔵Anti-CSRF
🟢https://t.me/gopher_academy/3937
▫️▪️▫️▪️▫️▪️▫️▪️▫️
🔵WaitGroup.Go
🟢https://t.me/gopher_academy/3943
▫️▪️▫️▪️▫️▪️▫️▪️▫️
🔵FlightRecorder
🟢https://t.me/gopher_academy/3939
▫️▪️▫️▪️▫️▪️▫️▪️▫️
🔵os.Root
🟢https://t.me/gopher_academy/3952
▫️▪️▫️▪️▫️▪️▫️▪️▫️
🔵reflect.TypeAssert
🟢https://t.me/gopher_academy/3947
▫️▪️▫️▪️▫️▪️▫️▪️▫️
🔵T.Attr
🟢https://t.me/gopher_academy/3956
▫️▪️▫️▪️▫️▪️▫️▪️▫️
🔵slog.GroupAttrs
🟢https://t.me/gopher_academy/3951
▫️▪️▫️▪️▫️▪️▫️▪️▫️
🔵hash.Cloner
🟢https://t.me/gopher_academy/3946
▫️▪️▫️▪️▫️▪️▫️▪️▫️
🔵synctest
🟢https://t.me/gopher_academy/3910
▫️▪️▫️▪️▫️▪️▫️▪️▫️
🔵 json/v2
🟢https://t.me/gopher_academy/3913
▫️▪️▫️▪️▫️▪️▫️▪️▫️
🔵 Container-aware GOMAXPROCS
🟢https://t.me/gopher_academy/3922
▫️▪️▫️▪️▫️▪️▫️▪️▫️
🔵New GC
🟢 https://t.me/gopher_academy/3925
▫️▪️▫️▪️▫️▪️▫️▪️▫️
🔵Anti-CSRF
🟢https://t.me/gopher_academy/3937
▫️▪️▫️▪️▫️▪️▫️▪️▫️
🔵WaitGroup.Go
🟢https://t.me/gopher_academy/3943
▫️▪️▫️▪️▫️▪️▫️▪️▫️
🔵FlightRecorder
🟢https://t.me/gopher_academy/3939
▫️▪️▫️▪️▫️▪️▫️▪️▫️
🔵os.Root
🟢https://t.me/gopher_academy/3952
▫️▪️▫️▪️▫️▪️▫️▪️▫️
🔵reflect.TypeAssert
🟢https://t.me/gopher_academy/3947
▫️▪️▫️▪️▫️▪️▫️▪️▫️
🔵T.Attr
🟢https://t.me/gopher_academy/3956
▫️▪️▫️▪️▫️▪️▫️▪️▫️
🔵slog.GroupAttrs
🟢https://t.me/gopher_academy/3951
▫️▪️▫️▪️▫️▪️▫️▪️▫️
🔵hash.Cloner
🟢https://t.me/gopher_academy/3946
▫️▪️▫️▪️▫️▪️▫️▪️▫️
❤4👍4🔥2 1
Gopher Academy pinned «🎯 ویژگی های جدید گولنگ نسخه 1.25 رو از اینجا بخونید 🔵synctest 🟢https://t.me/gopher_academy/3910 ▫️▪️▫️▪️▫️▪️▫️▪️▫️ 🔵 json/v2 🟢https://t.me/gopher_academy/3913 ▫️▪️▫️▪️▫️▪️▫️▪️▫️ 🔵 Container-aware GOMAXPROCS 🟢https://t.me/gopher_academy/3922 ▫️▪️▫️▪️▫️▪️▫️▪️▫️…»
🔵 عنوان مقاله
Lox: A Lexer and Parser Generator for Go
🟢 خلاصه مقاله:
مقاله به تحلیل و مقایسه دقیق دو ابزار تولید کننده پارسر میپردازد، که بر اساس ساختار و چارچوب عملیاتی آنها تمرکز دارد. پارسر مورد بحث در این مقاله از ANTLR الهام گرفته است که در آن ترکیب پارسر و لکسر و جدا سازی کد عملیاتی از دستور زبان مشخص است. با این حال، در مکانیزمهای عملیاتی اصلی، پارسر بیشتر شبیه به yacc است، که از الگوریتم LR(1) برای پارسینگ استفاده میکند و ساختاری بدون وابستگی دارد که نصب و نگهداری آن را آسانتر میکند.
🟣لینک مقاله:
https://golangweekly.com/link/171565/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Lox: A Lexer and Parser Generator for Go
🟢 خلاصه مقاله:
مقاله به تحلیل و مقایسه دقیق دو ابزار تولید کننده پارسر میپردازد، که بر اساس ساختار و چارچوب عملیاتی آنها تمرکز دارد. پارسر مورد بحث در این مقاله از ANTLR الهام گرفته است که در آن ترکیب پارسر و لکسر و جدا سازی کد عملیاتی از دستور زبان مشخص است. با این حال، در مکانیزمهای عملیاتی اصلی، پارسر بیشتر شبیه به yacc است، که از الگوریتم LR(1) برای پارسینگ استفاده میکند و ساختاری بدون وابستگی دارد که نصب و نگهداری آن را آسانتر میکند.
🟣لینک مقاله:
https://golangweekly.com/link/171565/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
dcaiafa.github.io
Lox
Lox is a lexer and parser generator for Go
🔥1
Forwarded from 𓄂 Bardia 𓆃
پاول دروف : اگه دانشآموزی و نمیدونی رو چی تمرکز کنی، برو سراغ ریاضی!
▪️ریاضی بهت یاد میده که به مغز خودت تکیه کنی، منطقی فکر کنی، مسئله رو خرد کنی و قدمبهقدم درست پیش بری.
▪️و این دقیقاً همون مهارتیه که برای ساختن شرکت، راه انداختن پروژه و موفقیت تو هر کاری لازمه!
▪️ریاضی بهت یاد میده که به مغز خودت تکیه کنی، منطقی فکر کنی، مسئله رو خرد کنی و قدمبهقدم درست پیش بری.
▪️و این دقیقاً همون مهارتیه که برای ساختن شرکت، راه انداختن پروژه و موفقیت تو هر کاری لازمه!
👍9
🔵 عنوان مقاله
🕹️ GORE: A Pure Go Minimal 'Doom' Implementation
🟢 خلاصه مقاله:
چند ماه پیش، پروژهای جالب توجه دوستداران برنامهنویسی و بازیهای کامپیوتری را به خود جلب کرد که شامل تبدیل نسخه اصلی بازی دوم از سال ١٩٩٣ به زبان برنامهنویسی گو بود. هدف از این پروژه تنها بازسازی بازی به زبان دیگر نبود، بلکه بهبود ساختار و کارایی کلی آن نیز در نظر گرفته شده بود. این تغییرات باعث شده بازی بدون نیاز به تنظیمات خاص پلتفرمی، روی سیستمها و دستگاههای مختلف به خوبی اجرا شود. یکی از جنبههای نوآورانه این پروژه، امکان اجرای بازی مستقیماً روی ترمینال است که نشاندهنده توانایی زبان گو در ارائه خروجیهای گرافیکی پیچیده در محیطی ساده است. این پروژه نه تنها زندگی جدیدی به یک اثر تاریخی در فرهنگ بازیهای ویدئویی میبخشد، بلکه امکان بازسازی بازیهای قدیمی دیگر را در محیطهای نرمافزاری معاصر فراهم میکند.
🟣لینک مقاله:
https://golangweekly.com/link/171558/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
🕹️ GORE: A Pure Go Minimal 'Doom' Implementation
🟢 خلاصه مقاله:
چند ماه پیش، پروژهای جالب توجه دوستداران برنامهنویسی و بازیهای کامپیوتری را به خود جلب کرد که شامل تبدیل نسخه اصلی بازی دوم از سال ١٩٩٣ به زبان برنامهنویسی گو بود. هدف از این پروژه تنها بازسازی بازی به زبان دیگر نبود، بلکه بهبود ساختار و کارایی کلی آن نیز در نظر گرفته شده بود. این تغییرات باعث شده بازی بدون نیاز به تنظیمات خاص پلتفرمی، روی سیستمها و دستگاههای مختلف به خوبی اجرا شود. یکی از جنبههای نوآورانه این پروژه، امکان اجرای بازی مستقیماً روی ترمینال است که نشاندهنده توانایی زبان گو در ارائه خروجیهای گرافیکی پیچیده در محیطی ساده است. این پروژه نه تنها زندگی جدیدی به یک اثر تاریخی در فرهنگ بازیهای ویدئویی میبخشد، بلکه امکان بازسازی بازیهای قدیمی دیگر را در محیطهای نرمافزاری معاصر فراهم میکند.
🟣لینک مقاله:
https://golangweekly.com/link/171558/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
GitHub
GitHub - AndreRenaud/gore: Pure Go minimal Doom implementation
Pure Go minimal Doom implementation. Contribute to AndreRenaud/gore development by creating an account on GitHub.
❤3
Forwarded from AI Labdon
🔴انتقال 100 میلیون کتاب در 7 دقیقه؟!
یه دانشمند ایرانی داره آیندهی اینترنت رو بازنویسی میکنه...
▪️تو دنیایی که هوش مصنوعی داره مغز دنیا میشه، یه مشکل بزرگ داریم: مصرف وحشتناک انرژی در دیتاسنترها.
اما حالا دکتر علیرضا گراوند از دانشگاه لاوال کانادا، با ساخت یه تراشه نوری فوقپیشرفته ورق رو برگردونده.
▪️این تراشه به نازکی یه تار موئه، ولی قدرتش؟ باورنکردنیه:
⚡️ ۱ ترابیت بر ثانیه سرعت انتقال داده
⚡️ ۲۰ برابر سریعتر از تکنولوژیهای رایج
⚡️ مصرف انرژی فوقالعاده پایین
⚡️ طراحیشده مخصوص مراکز هوش مصنوعی
📚 فقط تصور کن: این تراشه میتونه حجم ۱۰۰ میلیون کتاب رو در کمتر از ۷ دقیقه جابهجا کنه — فقط با نور، بدون جریان برق!
یه دانشمند ایرانی داره آیندهی اینترنت رو بازنویسی میکنه...
▪️تو دنیایی که هوش مصنوعی داره مغز دنیا میشه، یه مشکل بزرگ داریم: مصرف وحشتناک انرژی در دیتاسنترها.
اما حالا دکتر علیرضا گراوند از دانشگاه لاوال کانادا، با ساخت یه تراشه نوری فوقپیشرفته ورق رو برگردونده.
▪️این تراشه به نازکی یه تار موئه، ولی قدرتش؟ باورنکردنیه:
⚡️ ۱ ترابیت بر ثانیه سرعت انتقال داده
⚡️ ۲۰ برابر سریعتر از تکنولوژیهای رایج
⚡️ مصرف انرژی فوقالعاده پایین
⚡️ طراحیشده مخصوص مراکز هوش مصنوعی
📚 فقط تصور کن: این تراشه میتونه حجم ۱۰۰ میلیون کتاب رو در کمتر از ۷ دقیقه جابهجا کنه — فقط با نور، بدون جریان برق!
🔥4❤2🕊2🍾1
🔵 عنوان مقاله
What's //go:nosplit For?
🟢 خلاصه مقاله:
زبان برنامهنویسی Go ویژگیهایی دارد که به توسعهدهندگان اجازه میدهد با استفاده از دستورالعملهای محور به نظر، جنبههای مختلفی از اجرای کد خود را تنظیم کنند. یکی از این دستورالعملها "nosplit" است که از تقسیم پشته در توابع مشخص شده جلوگیری میکند و میتواند در سناریوهای خاص، عملکرد بهتری ارائه دهد؛ اما ممکن است منجر به خطاهای اجرایی یا قفل شدن زمانبندی شود. درک صحیح و استفاده از این دستورالعملها میتواند کنترل قابل توجهی بر عملکرد برنامههای Go ارائه دهد.
🟣لینک مقاله:
https://golangweekly.com/link/171543/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
What's //go:nosplit For?
🟢 خلاصه مقاله:
زبان برنامهنویسی Go ویژگیهایی دارد که به توسعهدهندگان اجازه میدهد با استفاده از دستورالعملهای محور به نظر، جنبههای مختلفی از اجرای کد خود را تنظیم کنند. یکی از این دستورالعملها "nosplit" است که از تقسیم پشته در توابع مشخص شده جلوگیری میکند و میتواند در سناریوهای خاص، عملکرد بهتری ارائه دهد؛ اما ممکن است منجر به خطاهای اجرایی یا قفل شدن زمانبندی شود. درک صحیح و استفاده از این دستورالعملها میتواند کنترل قابل توجهی بر عملکرد برنامههای Go ارائه دهد.
🟣لینک مقاله:
https://golangweekly.com/link/171543/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
mcyoung.xyz
What's //go:nosplit for? · mcyoung
🔥2
🔵 عنوان مقاله
Effortless Go Contract Testing: Inferred Automatically From Traffic
🟢 خلاصه مقاله:
مقالهای که مورد بررسی قرار گرفته، به اهمیت بهروزرسانی و انعطافپذیری قراردادها برای APIها در زمینههای فناوری میپردازد. روشهای سنتی تنظیم دستی قراردادها اغلب باعث ایجاد توافقنامههای شکنندهای میشود که با تغییرات APIها سازگار نیست. در این مقاله، روشی نوآورانه معرفی میشود که در آن قراردادها میتوانند از ترافیک واقعی API بهطور خودکار استنباط و بهروزرسانی شوند. این روش که با استفاده از دادههای واقعی ترافیک تولید میشود، باعث میشود که قراردادها دقیقاً با وضعیت فعلی APIها همخوانی داشته باشند و به نیازهای جدید بهطور موثر پاسخ دهند.
🟣لینک مقاله:
https://golangweekly.com/link/171560/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Effortless Go Contract Testing: Inferred Automatically From Traffic
🟢 خلاصه مقاله:
مقالهای که مورد بررسی قرار گرفته، به اهمیت بهروزرسانی و انعطافپذیری قراردادها برای APIها در زمینههای فناوری میپردازد. روشهای سنتی تنظیم دستی قراردادها اغلب باعث ایجاد توافقنامههای شکنندهای میشود که با تغییرات APIها سازگار نیست. در این مقاله، روشی نوآورانه معرفی میشود که در آن قراردادها میتوانند از ترافیک واقعی API بهطور خودکار استنباط و بهروزرسانی شوند. این روش که با استفاده از دادههای واقعی ترافیک تولید میشود، باعث میشود که قراردادها دقیقاً با وضعیت فعلی APIها همخوانی داشته باشند و به نیازهای جدید بهطور موثر پاسخ دهند.
🟣لینک مقاله:
https://golangweekly.com/link/171560/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Signadot
Let Systems Do the Work: A New Approach to Contract Testing
A smarter, low-maintenance approach to contract testing that catches real API issues before they hit production.
چجوری یه فریمورک ماژولار برای بالا آوردن سرویسهای بکاند طراحی کردم؟
من توی پست قبلیم اشاره کردم که یه فریمورکی برای زبان Golang نوشتم که به توسعهدهندهها کمک میکنه که سرویسهای بکاندشون رو توی چند ثانیه بالا بیارن.
خواستم بیشتر درباره معماریش و طراحی این فریمورک صحبت کنم.
خب اول از همه مشکلی که میخواستم با ساخت این فریمورک حل کنم این بود که تقریبا هر سری پروژههایی که میساختم یه سری کارهای تکراری داشت مثل:
راهاندازی HTTP Server
ساخت connectionهای دیتابیس
نوشتن دستی routeها
پیادهسازی CRUD برای هر entity
پیادهسازی Pagination و filter و sort
چون به نظرم میومد که این مراحل اکثراً ثابت هستن، خواستم یه جورایی این مراحل رو حذف کنم. با توجه به این مسئله، سعی کردم که یه طراحی ماژولار واسه این فریمورک در نظر بگیرم.
اولین بخش core :
همونطور که از اسمش معلومه، هسته مرکزی برنامهست و عملاً لایفسایکل برنامه رو مدیریت میکنه.
توابعی که برای رجیستر کردن HTTP Server و دیتابیس و entityها هستن، در واقع توی این بخش قرار دارن.
بعد از اون ماژول crud:
ماژولیه که handlerها و routeهامون رو داخلش تعریف شده. handlerها، همون handlerهای ثابتی هستن که برای هر entity داره تعریف میشه.
موارد مختلفی مثل اینکه چجوری باید با query parameterها رفتار بشه و hook های قبل و بعد از عملیات CRUD هم اینجا تعریف شدن.
رجیستر شدن routeها هم داخل routes داره اتفاق میافته.
سومین بخش ماژول HTTP هستش که دو تا اینترفیس اصلی داره:
یکی برای مدیریت کردن contextها
یکی برای مدیریت کردن خود HTTP Server (initialize کردن، رجیستر کردن routeها، استفاده از middlewareها، و در نهایت start کردن HTTP Server) که اگه بخوایم از HTTP Server استفاده کنیم، باید این اینترفیسها پیادهسازی شده باشن.
مورد چهارم database :
این بخش هم یه اینترفیس اصلی داره برای انجام عملیات CRUD.
هر دیتابیسی بخوایم استفاده کنیم، باید این اینترفیس رو پیادهسازی کرده باشه حتماً.
ماژول آخر هم hooks در نظر گرفتم.
شامل اینترفیسهایی میشه که قبل و بعد یه عملیات رو تعریف میکنن.
برای مثال:
اگه میخواید یه ولیدیشن روی یکی از فیلدهاتون قبل از ایجاد شدنش توی دیتابیس داشته باشید، برای همون entityتون اینترفیس BeforeCreate رو پیادهسازی میکنید و این ولیدیشن قبل از insert شدن انجام میشه.
سعی کردم خیلی خلاصه توضیح بدم. خوشحال میشم نظرتون رو درباره این معماری بدونم و اگر دوست داشتید یه سر به گیتهاب پروژه بزنید:
https://github.com/Lumicrate/gompose
<Iman Asgari/>
من توی پست قبلیم اشاره کردم که یه فریمورکی برای زبان Golang نوشتم که به توسعهدهندهها کمک میکنه که سرویسهای بکاندشون رو توی چند ثانیه بالا بیارن.
خواستم بیشتر درباره معماریش و طراحی این فریمورک صحبت کنم.
خب اول از همه مشکلی که میخواستم با ساخت این فریمورک حل کنم این بود که تقریبا هر سری پروژههایی که میساختم یه سری کارهای تکراری داشت مثل:
راهاندازی HTTP Server
ساخت connectionهای دیتابیس
نوشتن دستی routeها
پیادهسازی CRUD برای هر entity
پیادهسازی Pagination و filter و sort
چون به نظرم میومد که این مراحل اکثراً ثابت هستن، خواستم یه جورایی این مراحل رو حذف کنم. با توجه به این مسئله، سعی کردم که یه طراحی ماژولار واسه این فریمورک در نظر بگیرم.
اولین بخش core :
همونطور که از اسمش معلومه، هسته مرکزی برنامهست و عملاً لایفسایکل برنامه رو مدیریت میکنه.
توابعی که برای رجیستر کردن HTTP Server و دیتابیس و entityها هستن، در واقع توی این بخش قرار دارن.
بعد از اون ماژول crud:
ماژولیه که handlerها و routeهامون رو داخلش تعریف شده. handlerها، همون handlerهای ثابتی هستن که برای هر entity داره تعریف میشه.
موارد مختلفی مثل اینکه چجوری باید با query parameterها رفتار بشه و hook های قبل و بعد از عملیات CRUD هم اینجا تعریف شدن.
رجیستر شدن routeها هم داخل routes داره اتفاق میافته.
سومین بخش ماژول HTTP هستش که دو تا اینترفیس اصلی داره:
یکی برای مدیریت کردن contextها
یکی برای مدیریت کردن خود HTTP Server (initialize کردن، رجیستر کردن routeها، استفاده از middlewareها، و در نهایت start کردن HTTP Server) که اگه بخوایم از HTTP Server استفاده کنیم، باید این اینترفیسها پیادهسازی شده باشن.
مورد چهارم database :
این بخش هم یه اینترفیس اصلی داره برای انجام عملیات CRUD.
هر دیتابیسی بخوایم استفاده کنیم، باید این اینترفیس رو پیادهسازی کرده باشه حتماً.
ماژول آخر هم hooks در نظر گرفتم.
شامل اینترفیسهایی میشه که قبل و بعد یه عملیات رو تعریف میکنن.
برای مثال:
اگه میخواید یه ولیدیشن روی یکی از فیلدهاتون قبل از ایجاد شدنش توی دیتابیس داشته باشید، برای همون entityتون اینترفیس BeforeCreate رو پیادهسازی میکنید و این ولیدیشن قبل از insert شدن انجام میشه.
سعی کردم خیلی خلاصه توضیح بدم. خوشحال میشم نظرتون رو درباره این معماری بدونم و اگر دوست داشتید یه سر به گیتهاب پروژه بزنید:
https://github.com/Lumicrate/gompose
<Iman Asgari/>
👍4❤1🔥1🍾1 1