خطأ «مؤشر إلى واجهة، وليس واجهة»: كيف تمرر الواجهات بشكل صحيح في 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` (مؤشر إلى الواجهة)؟