Maison >développement back-end >Golang >Une structure Go implémente-t-elle une interface si un paramètre de méthode implémente cette interface ?

Une structure Go implémente-t-elle une interface si un paramètre de méthode implémente cette interface ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-09 02:46:08569parcourir

Does a Go Struct Implement an Interface If a Method Parameter Implements That Interface?

La structure n'implémente pas l'interface si son paramètre de méthode implémente l'interface

Dans Go, une structure implémente une interface si elle implémente toutes les méthodes de cette interface. Cependant, si une méthode struct a un paramètre qui implémente l'interface, la struct n'implémentera pas l'interface.

package main

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) {
    c := new(C)
    return c, nil
}

func test(b B) {
}

func main() {
    d := new(D)
    test(d)
}

Dans l'exemple ci-dessus, la struct D n'implémente pas l'interface B car la méthode Connect de D a un paramètre qui implémente l'interface A. Le message d'erreur que vous obtenez est :

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 corriger cette erreur, vous devez modifier le type du paramètre dans la méthode Connect de D en A.

type D struct {
}

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

Maintenant, la structure D implémentera l'interface B, et vous pourrez appeler la fonction test() avec une valeur D comme argument.

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