Avatar ·

خطأ "X does not implement Y (method has a pointer receiver)" في Go

مرحبًا! بدأت تعلم Go وواجهت خطأ غريبًا عند العمل مع الواجهات. لدي واجهة بسيطة `Speaker` مع طريقة `Speak()`، وهيكل `Dog` الذي ينفذ هذه الطريقة. ولكن عندما أحاول تمرير قيمة `Dog` إلى دالة تنتظر `Speaker`، يعطيني المترجم الخطأ التالي: ``` cannot use dog (variable of type Dog) as Speaker value in argument to makeSpeak: Dog does not implement Speaker (method Speak has a pointer receiver) ``` إليك الكود الخاص بي: ```go package main import "fmt" type Speaker interface { Speak() string } type Dog struct { Name string } func (d *Dog) Speak() string { return "Гав! Я " + d.Name } func makeSpeak(s Speaker) { fmt.Println(s.Speak()) } func main() { dog := Dog{Name: "Бобик"} makeSpeak(dog) // خطأ! } ``` أفهم أن الخطأ مرتبط بأن طريقة `Speak` معرفة على المؤشر (`*Dog`)، وليس على القيمة (`Dog`). ولكن لماذا هذه مشكلة؟ ففي Go المؤشرات تلقائيًا