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
🔴قابلیت 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 𓆃
🍾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
🎯 ویژگی های جدید گولنگ نسخه 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
▫️▪️▫️▪️▫️▪️▫️▪️▫️
4👍4🔥21
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
🔥1
Forwarded from 𓄂 Bardia 𓆃
پاول دروف : اگه دانش‌آموزی و نمی‌دونی رو چی تمرکز کنی، برو سراغ ریاضی!

▪️ریاضی بهت یاد می‌ده که به مغز خودت تکیه کنی، منطقی فکر کنی، مسئله رو خرد کنی و قدم‌به‌قدم درست پیش بری.

▪️و این دقیقاً همون مهارتیه که برای ساختن شرکت، راه انداختن پروژه و موفقیت تو هر کاری لازمه!
👍9
🔵 عنوان مقاله
🕹️ GORE: A Pure Go Minimal 'Doom' Implementation

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

چند ماه پیش، پروژه‌ای جالب توجه دوستداران برنامه‌نویسی و بازی‌های کامپیوتری را به خود جلب کرد که شامل تبدیل نسخه اصلی بازی دوم از سال ١٩٩٣ به زبان برنامه‌نویسی گو بود. هدف از این پروژه تنها بازسازی بازی به زبان دیگر نبود، بلکه بهبود ساختار و کارایی کلی آن نیز در نظر گرفته شده بود. این تغییرات باعث شده بازی بدون نیاز به تنظیمات خاص پلتفرمی، روی سیستم‌ها و دستگاه‌های مختلف به خوبی اجرا شود. یکی از جنبه‌های نوآورانه این پروژه، امکان اجرای بازی مستقیماً روی ترمینال است که نشان‌دهنده توانایی زبان گو در ارائه خروجی‌های گرافیکی پیچیده در محیطی ساده است. این پروژه نه تنها زندگی جدیدی به یک اثر تاریخی در فرهنگ بازی‌های ویدئویی می‌بخشد، بلکه امکان بازسازی بازی‌های قدیمی دیگر را در محیط‌های نرم‌افزاری معاصر فراهم می‌کند.

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


👑 @gopher_academy
3
Forwarded from AI Labdon
🔴انتقال 100 میلیون کتاب در 7 دقیقه؟!
یه دانشمند ایرانی داره آینده‌ی اینترنت رو بازنویسی می‌کنه...

▪️تو دنیایی که هوش مصنوعی داره مغز دنیا می‌شه، یه مشکل بزرگ داریم: مصرف وحشتناک انرژی در دیتاسنترها.
اما حالا دکتر علیرضا گراوند از دانشگاه لاوال کانادا، با ساخت یه تراشه نوری فوق‌پیشرفته ورق رو برگردونده.

▪️این تراشه به نازکی یه تار موئه، ولی قدرتش؟ باورنکردنیه:

⚡️ ۱ ترابیت‌ بر ثانیه سرعت انتقال داده
⚡️ ۲۰ برابر سریع‌تر از تکنولوژی‌های رایج
⚡️ مصرف انرژی فوق‌العاده پایین
⚡️ طراحی‌شده مخصوص مراکز هوش مصنوعی

📚 فقط تصور کن: این تراشه می‌تونه حجم ۱۰۰ میلیون کتاب رو در کمتر از ۷ دقیقه جابه‌جا کنه — فقط با نور، بدون جریان برق!
🔥42🕊2🍾1
🔵 عنوان مقاله
What's //go:nosplit For?

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

زبان برنامه‌نویسی Go ویژگی‌هایی دارد که به توسعه‌دهندگان اجازه می‌دهد با استفاده از دستورالعمل‌های محور به نظر، جنبه‌های مختلفی از اجرای کد خود را تنظیم کنند. یکی از این دستورالعمل‌ها "nosplit" است که از تقسیم پشته در توابع مشخص شده جلوگیری می‌کند و می‌تواند در سناریوهای خاص، عملکرد بهتری ارائه دهد؛ اما ممکن است منجر به خطاهای اجرایی یا قفل شدن زمان‌بندی شود. درک صحیح و استفاده از این دستورالعمل‌ها می‌تواند کنترل قابل توجهی بر عملکرد برنامه‌های Go ارائه دهد.

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


👑 @gopher_academy
🔥2
🔵 عنوان مقاله
Effortless Go Contract Testing: Inferred Automatically From Traffic

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

مقاله‌ای که مورد بررسی قرار گرفته، به اهمیت به‌روزرسانی و انعطاف‌پذیری قراردادها برای API‌ها در زمینه‌های فناوری می‌پردازد. روش‌های سنتی تنظیم دستی قراردادها اغلب باعث ایجاد توافق‌نامه‌های شکننده‌ای می‌شود که با تغییرات API‌ها سازگار نیست. در این مقاله، روشی نوآورانه معرفی می‌شود که در آن قراردادها می‌توانند از ترافیک واقعی API به‌طور خودکار استنباط و به‌روزرسانی شوند. این روش که با استفاده از داده‌های واقعی ترافیک تولید می‌شود، باعث می‌شود که قراردادها دقیقاً با وضعیت فعلی API‌ها هم‌خوانی داشته باشند و به نیازهای جدید به‌طور موثر پاسخ دهند.

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


👑 @gopher_academy
Forwarded from Software Engineer Labdon
3
چجوری یه فریمورک ماژولار برای بالا آوردن سرویس‌های بک‌اند طراحی کردم؟
من توی پست‌ قبلیم اشاره کردم که یه فریمورکی برای زبان 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/>
👍41🔥1🍾11