اینترفیسها (Interfaces)
اینترفیسهای Go با پیادهسازی ضمنی — قدرتمندترین ویژگی شیگرایی Go.
اینترفیس چیست؟
اینترفیس قراردادی است که مشخص میکند یک نوع چه متدهایی باید داشته باشد — بدون اینکه بگوید چگونه!
تعریف اینترفیس
type Speaker interface {
Speak() string
}
پیادهسازی ضمنی (Implicit)!
مهمترین ویژگی Go: نوعی که همه متدهای اینترفیس را داشته باشد، خودکار آن را پیادهسازی کرده — بدون هیچ کلیدواژهای!
type Dog struct{ Name string }
func (d Dog) Speak() string {
return d.Name + ": واق واق!"
}
// Dog حالا Speaker است! (بدون اعلام)
type Cat struct{ Name string }
func (c Cat) Speak() string {
return c.Name + ": میو!"
}
// Cat هم Speaker شد!
استفاده از اینترفیس
func MakeItSpeak(s Speaker) {
fmt.Println(s.Speak())
}
dog := Dog{"رکس"}
cat := Cat{"پیشی"}
MakeItSpeak(dog) ← رکس: واق واق!
MakeItSpeak(cat) ← پیشی: میو!
این همان چندریختی (Polymorphism) است — یک تابع، با انواع مختلف کار میکند!
اینترفیس با چند متد
type Shape interface {
Area() float64
Perimeter() float64
}
type Circle struct{ Radius float64 }
func (c Circle) Area() float64 { return math.Pi * c.Radius * c.Radius }
func (c Circle) Perimeter() float64 { return 2 * math.Pi * c.Radius }
type Rect struct{ W, H float64 }
func (r Rect) Area() float64 { return r.W * r.H }
func (r Rect) Perimeter() float64 { return 2 * (r.W + r.H) }
اینترفیس خالی — interface{}
اینترفیس بدون متد را هر نوعی پیاده میکند:
func describe(v interface{}) {
fmt.Printf("مقدار: %v، نوع: %T\n", v, v)
}
describe(42)
describe("سلام")
describe(true)
در Go جدید،
any نام مستعار interface{} است — کوتاهتر و مدرنتر!چک کردن نوع (Type Assertion)
var v any = "سلام"
s, ok := v.(string) ← ادعا: v از نوع string است
if ok {
fmt.Println("طول:", len(s))
}
اینترفیسهای ترکیبی
type Reader interface { Read() string }
type Writer interface { Write(string) }
// ترکیب دو اینترفیس
type ReadWriter interface {
Reader
Writer
}
چرا پیادهسازی ضمنی بهتر است؟
- نوع شما به اینترفیس وابسته نیست — حتی اگر اینترفیس بعداً ساخته شود!
- بدون فایلهای اضافه و کلیدواژه implements
- Decoupling طبیعی بین کدها
این مبحث بخشی از دوره آموزش کامل گو است.