ما هي الواجهة؟
تعرّف مجموعة دوال — أي نوع ينفّذها يحقّقها تلقائيًّا (تنفيذ ضمني):
type Shape interface {
Area() float64
}
type Circle struct{ r float64 }
func (c Circle) Area() float64 { return 3.14 * c.r * c.r }
type Square struct{ side float64 }
func (s Square) Area() float64 { return s.side * s.side }
التنفيذ الضمني
لا حاجة لـ implements — يكفي وجود الدوال:
func printArea(s Shape) {
fmt.Println(s.Area())
}
printArea(Circle{r: 5})
printArea(Square{side: 4})
تعدّد الأشكال
shapes := []Shape{Circle{r: 2}, Square{side: 3}}
for _, s := range shapes {
fmt.Println(s.Area()) // سلوك مختلف حسب النوع
}
الواجهة الفارغة
interface{} (أو any في Go الحديثة) تقبل أي قيمة:
func describe(i any) {
fmt.Printf("%T: %v\n", i, i)
}
describe(42)
describe("نص")
تأكيد النوع (Type Assertion)
var i any = "مرحبًا"
s, ok := i.(string) // s = "مرحبًا", ok = true
switch على النوع
switch v := i.(type) {
case int: fmt.Println("عدد", v)
case string: fmt.Println("نص", v)
}
💡 واجهات Go صغيرة ومركّزة — مثل
io.Readerبدالة واحدة.
🎯 التالي: معالجة الأخطاء (Errors).