AzLearn

الواجهات الشائعة

Common Interfaces

مفهوم ~20 دقيقة

الواجهات الشائعة — Common Interfaces

Go مبنية على واجهات صغيرة ومحددة. المكتبة القياسية مليئة بواجهات تُستخدم في كل مكان. فهم هذه الواجهات يجعلك تكتب كوداً أكثر احترافية ومتوافقاً مع النظام البيئي لـ Go.

واجهة fmt.Stringer

أي نوع يُنفّذ String() string يتحكم في كيفية طباعته:

main.go

واجهة error

واجهة error هي أبسط واجهة في Go — أسلوب واحد فقط:

type error interface {
    Error() string
}

أي نوع يُنفّذ Error() string يُعتبر خطأ:

main.go

واجهة io.Reader

io.Reader هي ربما أهم واجهة في Go. أي شيء يمكن القراءة منه (ملف، اتصال شبكة، نص) يُحقق هذه الواجهة:

type Reader interface {
    Read(p []byte) (n int, err error)
}
main.go

واجهة io.Writer

مكمّل io.Reader — أي شيء يمكن الكتابة إليه:

type Writer interface {
    Write(p []byte) (n int, err error)
}
main.go

واجهة sort.Interface

لترتيب أي مجموعة بيانات، نفّذ ثلاثة أساليب:

type Interface interface {
    Len() int
    Less(i, j int) bool
    Swap(i, j int)
}
main.go

نصيحة: منذ Go 1.8 يمكنك استخدام sort.Slice كبديل أبسط بدون تنفيذ الواجهة الكاملة. لكن فهم sort.Interface مهم للواجهات بشكل عام.

نمط القبول بواجهة والإرجاع ببنية

من أشهر أنماط Go: دوالك يجب أن تقبل واجهات وتُرجع أنواعاً محددة:

// ✅ قبول واجهة — يعمل مع أي Reader
func ProcessData(r io.Reader) (*Result, error) { ... }

// ❌ قبول نوع محدد — يعمل فقط مع *os.File
func ProcessData(f *os.File) (*Result, error) { ... }

هذا النمط يجعل كودك أكثر مرونة وقابلية للاختبار.

تحدي — Challenge