دروس Golang Interfaces بأمثلة للمطورين
إذا كنت مستخدمًا جديدًا للغة Go ، فقد يتم سماعك أو رؤيتك في الشفرة حول الواجهة {} كثيرًا في مقتطفات الشفرة والبرامج التعليمية. قد يكون هذا أمرًا شاقًا للغاية عند رؤية هذا في البداية. يعد تنفيذ الواجهة أحد المفاهيم الأساسية للغة البرمجة الموجهة للكائنات. إذا كنت قد استخدمت Java أو PHP أو Python ، فقد تعرف ما هي الواجهة وكيف يمكن أن يكون من المفيد إنشاء تطبيق قابل للتطوير.
تطبيق النقدية فشل إضافة النقدية
واجهة Go
الواجهة في Go هي ملف نوع تم تعريفه باستخدام مجموعة من تواقيع الأسلوب. تحدد الواجهة سلوك نوع مماثل من الكائنات.
على سبيل المثال ، هذه واجهة تحدد سلوك الأشكال الهندسية:
// Go Interface - `Shape` type Shape interface { Area() float64 Perimeter() float64 }
تم التصريح عن الواجهة باستخدام type
الكلمة الأساسية ، متبوعة باسم الواجهة والكلمة الأساسية interface
. ثم نحدد مجموعة من تواقيع الأسلوب داخل أقواس معقوفة.
تنفيذ واجهة في Go
لتنفيذ واجهة ، تحتاج فقط إلى تنفيذ جميع الأساليب المعلنة في الواجهة.
يتم تنفيذ Go Interfaces بشكل ضمني
على عكس اللغات الأخرى مثل جافا ، لا تحتاج إلى تحديد هذا النوع صراحةً implements
واجهة تستخدم شيئًا مثل الكلمة الأساسية للتنفيذ.
فيما يلي نوعان من الهياكل التي تقوم بتنفيذ Shape
واجهه المستخدم:
إيداع الشيكات النقدية التطبيق
// Struct type `Rectangle` - implements the `Shape` interface by implementing all its methods. type Rectangle struct { Length, Width float64 } func (r Rectangle) Area() float64 { return r.Length * r.Width } func (r Rectangle) Perimeter() float64 { return 2 * (r.Length + r.Width) }
// Struct type `Circle` - implements the `Shape` interface by implementing all its methods. 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 } func (c Circle) Diameter() float64 { return 2 * c.Radius }
استخدام نوع واجهة بقيم ملموسة
لا تكون الواجهة في حد ذاتها مفيدة إلى هذا الحد إلا إذا استخدمناها بنوع ملموس يطبق جميع أساليبها.
دعونا نرى كيف يمكن استخدام الواجهة بقيم محددة.
gitlab ci / cd vs jenkins
- يمكن أن يحتوي نوع الواجهة على أي قيمة تنفذ جميع أساليبها
package main import ( 'fmt' 'math' ) func main() { var s Shape = Circle{5.0} fmt.Printf('Shape Type = %T, Shape Value = %v
', s, s) fmt.Printf('Area = %f, Perimeter = %f
', s.Area(), s.Perimeter()) var s1 Shape = Rectangle{4.0, 6.0} fmt.Printf('Shape Type = %T, Shape Value = %v
', s1, s1) fmt.Printf('Area = %f, Perimeter = %f
', s1.Area(), s1.Perimeter()) }
# Output Shape Type = main.Circle, Shape Value = {5} Area = 78.539816, Perimeter = 31.415927 Shape Type = main.Rectangle, Shape Value = {4 6} Area = 24.000000, Perimeter = 20.000000
- استخدام أنواع الواجهة كوسيطات للوظائف
package main import ( 'fmt' ) // Generic function to calculate the total area of multiple shapes of different types func CalculateTotalArea(shapes ...Shape) float64 { totalArea := 0.0 for _, s := range shapes { totalArea += s.Area() } return totalArea } func main() { totalArea := CalculateTotalArea(Circle{2}, Rectangle{4, 5}, Circle{10}) fmt.Println('Total area = ', totalArea) }
# Output Total area = 346.7256359733385
- استخدام أنواع الواجهة كحقول
package main import ( 'fmt' ) // Interface types can also be used as fields type MyDrawing struct { shapes []Shape bgColor string fgColor string } func (drawing MyDrawing) Area() float64 { totalArea := 0.0 for _, s := range drawing.shapes { totalArea += s.Area() } return totalArea } func main() { drawing := MyDrawing{ shapes: []Shape{ Circle{2}, Rectangle{3, 5}, Rectangle{4, 7}, }, bgColor: 'red', fgColor: 'white', } fmt.Println('Drawing', drawing) fmt.Println('Drawing Area = ', drawing.Area()) }
# Output Drawing {[{2} {3 5} {4 7}] red white} Drawing Area = 55.56637061435917
قيم الواجهة: كيف يعمل نوع الواجهة مع القيم الملموسة؟
تحت الغطاء ، يمكن اعتبار قيمة الواجهة على أنها مجموعة تتكون من قيمة ونوع ملموس:
// interface (value, type)
دعونا نرى مثالاً لفهم المزيد:
package main import ( 'fmt' ) func main() { var s Shape s = Circle{5} fmt.Printf('(%v, %T)
', s, s) fmt.Printf('Shape area = %v
', s.Area()) s = Rectangle{4, 7} fmt.Printf('(%v, %T)
', s, s) fmt.Printf('Shape area = %v
', s.Area()) }
# Output ({5}, main.Circle) Shape area = 78.53981633974483 ({4 7}, main.Rectangle) Shape area = 28
تحقق من إخراج البرنامج أعلاه ولاحظ كيف المتغير s
معلومات حول قيمة ونوع Shape
التي تم تعيينها لها.
كيفية عرض تويتر الخاص دون متابعة
عندما نستدعي طريقة على قيمة الواجهة ، يتم تنفيذ طريقة بنفس الاسم على النوع الأساسي.
على سبيل المثال ، في البرنامج أعلاه ، عندما نطلق على الطريقة Area()
على المتغير s
، ينفذ Area()
طريقة من نوعه الأساسي.
#Go #Golang