Maison >développement back-end >Golang >Comment les méthodes Go Struct doivent-elles correspondre aux définitions d'interface pour éviter les incompatibilités de types ?

Comment les méthodes Go Struct doivent-elles correspondre aux définitions d'interface pour éviter les incompatibilités de types ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-15 02:16:13872parcourir

How Do Go Struct Methods Need to Match Interface Definitions to Avoid Type Mismatches?

Restrictions d'implémentation d'interface sur les méthodes Struct

Dans Go, une structure ne peut implémenter une interface que si elle a une méthode du même nom, type et signature comme méthode d’interface. Considérez le code suivant :

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) { return &C{}, nil } // Return type mismatch

func test(b B) {}

func main() {
    d := &D{}
    test(d) // Error: type mismatch for Connect() method
}

Ici, le message d'erreur est : "ne peut pas utiliser d (type D) comme type B dans l'argument pour tester : D n'implémente pas B (mauvais type pour la méthode Connect)". Cela se produit car le type de retour de la méthode Connect de D est *C, ce qui ne correspond pas au type de retour (A, erreur) spécifié par l'interface B.

Par conséquent, si la méthode d'une structure diffère dans son paramètre ou son retour tapez à partir de la méthode d'interface correspondante, la structure n'implémente pas l'interface.

Résoudre le problème

Pour résoudre ce problème problème, la méthode Connect de la struct D doit s'aligner sur la méthode Connect de l'interface B. Cela implique de s'assurer qu'elle renvoie le type attendu (A, erreur).

import "fmt"

type A interface {
    Close()
}

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

type C struct {
    name string
}

func (c *C) Close() {
    fmt.Println("C closed")
}

type D struct {}

func (d *D) Connect() (A, error) {
    return &C{"D"}, nil
}

func test(b B) {
    b.Connect().Close() // Call Close() on the returned A
}

func main() {
    test(&D{})
}

Avec cette modification, le code compile et s'exécute sans erreur, car la méthode Connect de la structure D adhère désormais à la définition de l'interface B.

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