المتلقي والواجهة

الطرق التي تحتوي على متلقي القيمة يمكن استدعاؤها باستخدام القيم والمؤشرات.

الطرق التي تحتوي على متلقي المؤشر يمكن استدعاؤها فقط باستخدام المؤشرات أو قيم العناوين.

على سبيل المثال،

type S struct {
  data string
}

func (s S) Read() string {
  return s.data
}

func (s *S) Write(str string) {
  s.data = str
}

sVals := map[int]S{1: {"A"}}

// يمكنك استدعاء Read فقط باستخدام القيم
sVals[1].Read()

// هذا لن يتم تجميعه:
// sVals[1].Write("test")

sPtrs := map[int]*S{1: {"A"}}

// يمكن استدعاء كل من الطرق Read و Write بواسطة مؤشر
sPtrs[1].Read()
sPtrs[1].Write("test")

بنفس الطريقة، حتى إذا كانت لديها طريقة متلقية للقيم، يمكنها تلبية واجهة باستخدام متلقي المؤشر.

type F interface {
  f()
}

type S1 struct{}

func (s S1) f() {}

type S2 struct{}

func (s *S2) f() {}

s1Val := S1{}
s1Ptr := &S1{}
s2Val := S2{}
s2Ptr := &S2{}

var i F
i = s1Val
i = s1Ptr
i = s2Ptr

// لن يتم تجميع الرمز التالي لأن s2Val هو قيمة وطريقة f لـ S2 ليس لديها متلقي القيم
// i = s2Val

Effective Go يحتوي على شروحات ممتازة حول المؤشرات مقابل القيم.

ملاحظات إضافية:

  • يمكن للنوع أن يحتوي مجموعة طرق مع متلقي القيمة ومجموعة طرق مع متلقي المؤشر
    • مجموعة الطرق بمتلقي القيمة هي جزء فرعي من مجموعة الطرق بمتلقي المؤشر، ولكن ليس العكس
  • قواعد
    • يمكن لكائنات القيم استخدام مجموعة الطرق بمتلقي القيمة فقط
    • يمكن لكائنات المؤشر استخدام مجموعة الطرق بمتلقي القيمة + مجموعة الطرق بمتلقي المؤشر
  • تطابق الواجهة (أو التنفيذ)
    • يتطابق النوع مع الواجهة إذا كان ينفذ كل طرق الواجهة
    • على وجه الخصوص، إما أن تتطابق مجموعة طرق القيم للنوع مع واجهة أو أن تتطابق مجموعة طرق المؤشر مع الواجهة

هناك نوعان محدديان من التطابق:

  • تتطابق مجموعة طرق القيم مع الواجهة
    • من الجيد تعيين كائن قيمة أو مؤشر إلى متغير واجهة لأن كلاهما يحتوي على mجموعة طرق القيم
  • تتطابق مجموعة طرق المؤشر مع الواجهة
    • يمكن تعيين كائن مؤشر فقط إلى متغير واجهة لأن مجموعة طرق المؤشر فقط تتطابق مع الواجهة
    • إذا تم تعيين كائن قيمة إلى متغير واجهة، سيؤدي ذلك إلى تشغيل آلية فحص الواجهة خلال التجميع

أما بالنسبة لسبب أن i = s2Val يؤدي إلى حدوث خطأ، فذلك بسبب عدم تطابق مجموعة طرق القيم والواجهة.