Appel de méthodes sur des pointeurs d'interface dans Go
Dans Go, vous pouvez rencontrer le besoin de programmer sur une interface et d'utiliser des transactions sans modifier votre code. Une approche courante consiste à transmettre un pointeur vers un « objet » dans une propriété de champ pour activer les restaurations si nécessaire. Cependant, cette approche peut prêter à confusion.
Considérons un exemple de code :
package repositories import ( "github.com/coopernurse/gorp" ) type Repository struct { Gorp *gorp.SqlExecutor // Pointer to SqlExecutor } func (r *Repository) GetById(i interface{}, key interface{}) interface{} { obj, err := r.Gorp.Get(i, key) // Call method on pointer if err != nil { panic(err) } return obj }
Ici, vous pourriez croire que vous avez besoin d'un pointeur vers "l'objet" Gorp pour effectuer des restaurations. Cependant, il est important de comprendre certains concepts clés dans Go :
Dans l'exemple de code, même si vous disposez d'un pointeur vers Gorp SqlExecutor, vous ne pouvez pas appeler de méthodes sur le pointeur d'interface lui-même. Vous appelez plutôt des méthodes sur la valeur sous-jacente. Dans ce cas, la valeur sous-jacente est une structure SqlExecutor.
Par conséquent, vous pouvez supprimer en toute sécurité le pointeur de la structure Repository et simplement transmettre l'interface SqlExecutor au Repository :
package repositories import ( "github.com/coopernurse/gorp" ) type Repository struct { Gorp gorp.SqlExecutor // Pointer removed } func (r *Repository) GetById(i interface{}, key interface{}) interface{} { obj, err := r.Gorp.Get(i, key) if err != nil { panic(err) } return obj }
Ceci le code fonctionnera comme prévu et vous permettra d'utiliser des transactions sans modifier le SqlExecutor sous-jacent. Vous n'avez pas à vous soucier de passer des pointeurs vers des interfaces dans ce contexte.
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!