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 ?

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 ?

Susan Sarandon
Libérer: 2024-12-14 14:33:15
original
677 Les gens l'ont consulté

Why Do I Get an

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 :

  1. Pour optimiser les performances lors du passage de grandes valeurs de structure.
  2. Pour permettre à l'appelé de modifier la valeur d'origine (lorsque la méthode a un récepteur de pointeur).

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
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal