جولة Go التفاعلية بالعربي › التوابع والواجهات 5 / 7 السابق التالي

التوابع والوصول غير المباشر عبر المؤشرات

التوابع والوصول غير المباشر عبر المؤشرات

عند مقارنة البرنامجين السابقين، قد تلاحظ أن الدوال ذات الوسيط المؤشري يجب أن تستقبل مؤشرًا:

var v Vertex
ScaleFunc(v, 5)  // Compile error!
ScaleFunc(&v, 5) // OK

بينما تستقبل التوابع ذات المستقبِلات المؤشرية إما قيمة أو مؤشرًا بوصفه المستقبِل عند استدعائها:

var v Vertex
v.Scale(5)  // OK
p := &v
p.Scale(10) // OK

في التعليمة v.Scale(5)، رغم أن v قيمة وليست مؤشرًا، يُستدعى التابع ذو المستقبِل المؤشري تلقائيًا. أي إن غو، تيسيرًا للاستخدام، تفسّر التعليمة v.Scale(5) على أنها (&v).Scale(5) لأن التابع Scale له مستقبِل مؤشري.

النص الأصلي بالإنجليزية

Methods and pointer indirection

Comparing the previous two programs, you might notice that functions with a pointer argument must take a pointer:

var v Vertex
ScaleFunc(v, 5)  // Compile error!
ScaleFunc(&v, 5) // OK

while methods with pointer receivers take either a value or a pointer as the receiver when they are called:

var v Vertex
v.Scale(5)  // OK
p := &v
p.Scale(10) // OK

For the statement v.Scale(5), even though v is a value and not a pointer, the method with the pointer receiver is called automatically. That is, as a convenience, Go interprets the statement v.Scale(5) as (&v).Scale(5) since the Scale method has a pointer receiver.

هذا الدرس للقراءة فقط؛ جرّب المثال في الدرس التالي.

استعادة المثال الأصلي؟

ستُحذف تعديلاتك على شيفرة هذا الدرس، ويعود المثال كما ورد في الكتاب. لا يتغيّر اختيارك لمحرك التشغيل.