Avatar ·

خطأ «مؤشر إلى واجهة، وليس واجهة»: كيف تمرر الواجهات بشكل صحيح في Go؟

مرحباً بالجميع! أنا مبتدئ في Go وواجهت خطأ ترجمة غير مفهوم: «*MyInterface is pointer to interface, not interface». لدي واجهة وهيكل ينفذها: ```go type Animal interface { Speak() string } type Dog struct{} func (d *Dog) Speak() string { return "Woof!" } ``` أريد تمرير مؤشر إلى الهيكل إلى دالة تقبل واجهة: ```go func MakeSound(a Animal) { fmt.Println(a.Speak()) } func main() { dog := &Dog{} MakeSound(dog) // يعمل } ``` لكن إذا حاولت تمرير **مؤشر إلى واجهة** (لسبب ما)، أحصل على خطأ: ```go func main() { var animalInterface Animal animalInterface = &Dog{} MakeSound(&animalInterface) // خطأ: cannot use &animalInterface (variable of type *Animal) as type Animal in argument to MakeSound } ``` لماذا يحدث هذا؟ ما الفرق بين تمرير `*Dog` (الذي ينفذ الواجهة) و`*Animal` (مؤشر إلى الواجهة)؟