Maison >développement back-end >Golang >Pourquoi une structure Go n'implémente-t-elle pas une interface si le paramètre ou le type de retour d'une méthode ne correspond pas entièrement ?

Pourquoi une structure Go n'implémente-t-elle pas une interface si le paramètre ou le type de retour d'une méthode ne correspond pas entièrement ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-15 11:18:11790parcourir

Why Doesn't a Go Struct Implement an Interface if a Method's Parameter or Return Type Doesn't Fully Match?

La structure n'implémente pas l'interface si elle possède une méthode dont le paramètre implémente l'interface

Dans cet exemple, nous avons deux interfaces, A et B, et deux structures, C et D, qui les mettent en œuvre. Lorsque vous essayez de transmettre une instance de D à une fonction attendant un type qui implémente B, une erreur est rencontrée.

Comprendre l'implémentation de l'interface

Les interfaces définissent les signatures de méthode auxquelles les types d'implémentation doivent adhérer. Une structure implémente une interface si elle possède des méthodes avec les mêmes signatures que celles de l'interface.

Le problème avec la méthode Connect en D

Le problème survient parce que la méthode Connect en D renvoie un pointeur à C au lieu de A. Selon l'interface B, la méthode Connect devrait renvoyer A. Cette incompatibilité empêche D d'implémenter complètement l'interface B.

Corriger le Implémentation

Pour résoudre le problème, le type de retour de Connect dans D doit être modifié pour correspondre à la définition de l'interface :

type D struct {
}

func (d *D) Connect() (A, error) {  // Returns A, not *C
    c := new(C)
    return c, nil
}

Typage structurel dans Go

Typage structurel de Go permet aux structures d'implémenter des interfaces sans les déclarer explicitement. Cela peut entraîner des erreurs si les méthodes de la structure ne correspondent pas aux signatures de l'interface.

Remarques sur les types d'arguments d'interface

Lors du passage d'un objet à une fonction attendant une interface, le type de l'objet doit implémenter cette interface. Dans le cas d'Equaler, le type d'argument d'Equal doit correspondre au type d'interface, pas simplement à un autre type de structure qui implémente également 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