Maison > développement back-end > Golang > Pourquoi My Go Struct n'implémente-t-il pas l'interface ?

Pourquoi My Go Struct n'implémente-t-il pas l'interface ?

Mary-Kate Olsen
Libérer: 2024-12-06 22:39:12
original
420 Les gens l'ont consulté

Why Doesn't My Go Struct Implement the Interface?

La mise en œuvre de l'interface nécessite des signatures de méthode correspondantes

Dans Go, les interfaces dictent la structure d'une méthode, y compris son nom, ses arguments et ses valeurs de retour. Lorsqu'une structure implémente une interface, elle doit strictement respecter les signatures de méthode spécifiées par l'interface.

Considérez cet exemple où une structure, D, et sa méthode, Connect, ne parviennent pas à implémenter l'interface B en raison d'un incompatibilité dans la valeur de retour :

type A interface {
    Close()
}

type B interface {
    Connect() (A, error)
}

type C struct {
}

func (c *C) Close() {

}

type D struct {
}

func (d *D) Connect() (*C, error) { // Mismatched function signature compared to interface B's Connect method
    c := new(C)
    return c, nil
}
Copier après la connexion

Dans ce cas, Connect in D renvoie un pointeur vers C et une erreur, mais l'interface B s'attend à ce que Connect renvoie une implémentation de A et un erreur. Par conséquent, l'erreur indique que la structure D n'implémente pas l'interface B, soulignant l'importance de l'alignement entre les signatures de méthode.

cannot use d (type *D) as type B in argument to test:
*D does not implement B (wrong type for Connect method)
have Connect() (*C, error)
want Connect() (A, error)
Copier après la connexion

Pour résoudre ce problème, assurez-vous que les signatures de méthode dans l'implémentation de la structure correspondent les déclarations de méthode dans l’interface. Dans ce scénario, la méthode Connect en D doit être modifiée pour être conforme à l'interface B :

func (d *D) Connect() (A, error) {
    c := new(C)
    return c, nil
}
Copier après la connexion

En revanche, si la signature de la méthode dans l'implémentation de la structure diffère de l'interface, la structure n'implémentera pas la interface.

type Equaler interface {
    Equal(Equaler) bool
}

type T int
func (t T) Equal(u T) bool { // Argument type mismatch
    return t == u
} // does not satisfy Equaler
Copier après la connexion

Dans cet exemple, le type d'argument dans Equal doit correspondre au type d'interface Equaler au lieu d'un type différent, T, pour implémenter correctement l'interface.

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