🧵 شیگرایی بدون کلاس؟ Go یه راه باحالتر داره!
تو خیلی از زبانها مثل Java یا Python، وقتی حرف از شیگرایی میشه، فوراً میری سراغ کلاس و وراثت. ولی Go میگه: «بیخیال کلاس و دردسرهاش، یه راه سادهتر و قدرتمندتر داریم» 😎
📌 اینجاست که interface و implementation وارد میشن! 🎯
🔧حالا Interface چیه؟
خوب، Interface تو Go یعنی یه مجموعه از متدهایی که یه نوع (type) باید پیادهسازیشون کنه. بدون این که لازم باشه صریحاً بگی این struct، این interface رو implement میکنه!
مثلاً:
type Speaker interface {
Speak() string
}
هر تایپی که متد ()Speak رو داشته باشه، خودش بهطور خودکار یه Speaker حساب میشه! 🤯
🧱حالا Implementation یعنی چی؟
پیاده سازی یا Implementation یعنی یه struct بسازی و متدهایی که interface لازم داره رو روش پیاده کنی.
type Human struct {}
func (h Human) Speak() string {
return "سلام! من انسانم"
}
خب، حالا چون Human متد ()Speak رو داره، خودشبهخود یه Speaker هم هست. لازم نیست هیچ جا بنویسی implements Speaker — Go خودش میفهمه! 🔍
💡 چرا این بهتر از کلاس و وراثته؟
✅ ترکیب بهجای وراثت: تو Go میتونی چند تا behavior رو ترکیب کنی، بدون این که مجبور شی از یه کلاس دیگه ارث ببری.
✅ ساده و شفاف: خبری از heirarchy و درختهای پیچیدهی کلاس نیست.
✅ انعطافپذیر: هر struct میتونه چندین interface رو همزمان satisfy کنه.
🛠 استفادهی واقعی
func SaySomething(s Speaker) {
fmt.Println(s.Speak())
}
حالا میتونی هر چیزی که متد ()Speak داره، به این تابع بدی:
SaySomething(Human{})
حتی structهای دیگه:
type Robot struct {}
func (r Robot) Speak() string {
return "010010 سلام"
}
SaySomething(Robot{})
🔄 Interface خالی: interface{}
اگه نمیدونی طرف چی میفرسته، میتونی از interface خالی استفاده کنی:
func PrintAnything(v interface{}) {
fmt.Println(v)
}
ولی حواست باشه این قدرت زیاد میتونه باعث تاریکی بشه! ☠️
🧪 حالا Dependency Injection با Interface چطوریه؟
یه فایدهی خفن دیگه: تستنویسی راحتتر میشه! چون میتونی یه Mock بسازی که همون interface رو پیاده کنه. دیگه لازم نیست وابسته به یه struct خاص باشی.
type DB interface {
Save(data string) error
}
تو تست، یه FakeDB میسازی و به جای دیتابیس واقعی میدی به کدت.
⚠️ نکات مهم
🚫 گو وراثت نداره. بهجاش composition و interface استفاده کن.
🧩 فقط وقتی interface بساز که واقعاً لازم باشه. زیاد کردن interfaceهای الکی، کد رو پیچیده میکنه.
🔄 ساختارها (struct) بهطور خودکار میتونن interfaceها رو satisfy کنن، فقط کافیه متد درست رو داشته باشن.
#golang
☕️Telegram | Website | Discord
1.7K ·