الواجهات الشائعة
Common Interfaces
مفهوم
~20 دقيقة
الواجهات الشائعة — Common Interfaces
Go مبنية على واجهات صغيرة ومحددة. المكتبة القياسية مليئة بواجهات تُستخدم في كل مكان. فهم هذه الواجهات يجعلك تكتب كوداً أكثر احترافية ومتوافقاً مع النظام البيئي لـ Go.
واجهة fmt.Stringer
أي نوع يُنفّذ String() string يتحكم في كيفية طباعته:
main.go
Output:
واجهة error
واجهة error هي أبسط واجهة في Go — أسلوب واحد فقط:
type error interface {
Error() string
}
أي نوع يُنفّذ Error() string يُعتبر خطأ:
main.go
Output:
واجهة io.Reader
io.Reader هي ربما أهم واجهة في Go. أي شيء يمكن القراءة منه (ملف، اتصال شبكة، نص) يُحقق هذه الواجهة:
type Reader interface {
Read(p []byte) (n int, err error)
}
main.go
Output:
واجهة io.Writer
مكمّل io.Reader — أي شيء يمكن الكتابة إليه:
type Writer interface {
Write(p []byte) (n int, err error)
}
main.go
Output:
واجهة sort.Interface
لترتيب أي مجموعة بيانات، نفّذ ثلاثة أساليب:
type Interface interface {
Len() int
Less(i, j int) bool
Swap(i, j int)
}
main.go
Output:
نصيحة: منذ 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
عرّف نوع Player مع Name و Score ونفّذ sort.Interface