اینترفیس‌ها (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
}

چرا پیاده‌سازی ضمنی بهتر است؟

این مبحث بخشی از دوره آموزش کامل گو است.

ابزارهای مرتبط