Polymorphisme en Go : un examen plus approfondi des méthodes d'interface et des récepteurs de pointeurs
En Go, le polymorphisme n'est pas pris en charge nativement, mais il peut être réalisé à l’aide d’interfaces. Cela introduit une question courante : pourquoi les méthodes setter ne sont-elles pas autorisées pour les interfaces ?
Comme le démontre le code fourni, lorsque la méthode setter est définie comme récepteur de valeur, les modifications apportées au sein de la fonction sont perdues à sa sortie. . La modification du récepteur en récepteur pointeur permet des modifications permanentes, mais cela génère une erreur de compilation.
Pour résoudre ce problème, Go propose une solution de contournement. Le code corrigé modifie le récepteur de la méthode setter pour être un pointeur. Cela permet à la fonction de modifier la structure de données sous-jacente et de conserver les modifications. Le code modifié utilise une interface, garantissant que la méthode du récepteur de pointeur est accessible via l'interface.
package main import "fmt" type MyInterfacer interface { Get() int Set(i int) } type MyStruct struct { data int } func (this *MyStruct) Get() int { return this.data } func (this *MyStruct) Set(i int) { this.data = i } func main() { s := &MyStruct{123} fmt.Println(s.Get()) s.Set(456) fmt.Println(s.Get()) var mi MyInterfacer = s mi.Set(789) fmt.Println(mi.Get()) }
Bien qu'il ne s'agisse pas strictement d'un polymorphisme, il obtient effectivement un résultat similaire en utilisant des interfaces et des récepteurs de pointeurs. Le code peut être utilisé pour définir des propriétés via une interface, encapsulant proprement les données et les opérations.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!