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
Mary-Kate Olsenoriginal
2024-12-06 22:39:12414parcourir

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
}

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)

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
}

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

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!

Déclaration:
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