Maison >développement back-end >Golang >Pourquoi est-ce que j'obtiens une erreur « Méthode non définie » lors de l'appel de méthodes sur un pointeur d'interface dans Go ?
Appel de méthodes sur des pointeurs d'interface dans Golang
Lorsqu'ils travaillent avec la bibliothèque Gorp pour accéder à la base de données, les développeurs rencontrent souvent le besoin d'appeler des méthodes sur un pointeur d'interface tout en conservant la possibilité d'annuler les transactions. Ce problème découle de la nécessité de transmettre l'instance Gorp DbMap ou Transaction en tant que propriété de champ.
Le problème
Comme démontré dans l'exemple de code, tenter d'appeler des méthodes sur l'interface SqlExecutor, l'utilisation d'une référence de pointeur entraîne une erreur de méthode non définie. Cela se produit parce que le type *gorp.SqlExecutor n'a pas de méthode Get, alors que l'interface gorp.SqlExecutor elle-même en a.
La solution
L'idée fausse sous-jacente réside dans l'hypothèse selon laquelle le passage d'un pointeur vers une valeur d'interface fournit le même comportement que l'appel par référence dans d'autres langages. Dans Go, les pointeurs vers les interfaces sont utilisés pour deux raisons spécifiques :
Aucune de ces raisons ne s'applique aux pointeurs vers des interfaces, car les valeurs d'interface sont déjà minuscules et ne peuvent pas être modifiées via la valeur d'interface. lui-même. Au lieu de cela, il est nécessaire de modifier la valeur stockée à l'intérieur de la valeur d'interface, qui est souvent un pointeur vers une structure réelle.
Implémentation correcte
Pour résoudre le problème, le code doit éviter de passer un pointeur vers "l'objet" Gorp et plutôt transmettre directement la valeur de l'interface. Le code suivant implémente correctement cette approche :
package repositories import "github.com/coopernurse/gorp" type Repository struct { Gorp gorp.SqlExecutor // Pass the interface value directly } func (r Repository) GetById(i interface{}, key interface{}) interface{} { obj, err := r.Gorp.Get(i, key) if err != nil { panic(err) } return obj }
En passant la valeur de l'interface par valeur et non par référence, le code peut conserver la fonctionnalité requise tout en respectant le bon usage des pointeurs dans Go.
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!