Maison > développement back-end > Golang > Comment attribuer une fonction renvoyant une structure implémentant une interface en Go ?

Comment attribuer une fonction renvoyant une structure implémentant une interface en Go ?

Barbara Streisand
Libérer: 2024-12-06 20:28:13
original
956 Les gens l'ont consulté

How to Assign a Function Returning a Struct Implementing an Interface in Go?

Utilisation de types de fonctions Go qui renvoient des structures avec des interfaces

Question :

Dans Go, j'ai une structure en une package qui implémente une interface. Dans un autre package dépendant, je souhaite créer une fausse implémentation de cette structure à des fins de test. Cependant, Go se plaint de la sécurité des types lorsque j'essaie d'attribuer une fonction renvoyant une structure qui implémente l'interface à une variable de cette interface.

Architecture :

// Package expensive
type myStruct struct{}

func (m *myStruct) DoSomething() {...}
func (m *myStruct) DoSomethingElse() {...}
func CreateInstance() *myStruct {...} // Expensive to call

// Package main
type myInterface interface {
    DoSomething()
}

type structToConstruct struct {
    factoryFunction func() myInterface
}
func (s *structToConstruct) performAction() {...}
Copier après la connexion

Erreur :

"impossible d'utiliser cher.CreateInstance (tapez func() *expensive.myStruct) en tapant func() myInterface dans la valeur du champ"

Réponse :

Le problème se pose car la fonction CreateInstance renvoie une valeur *myStruct, qui diffère à partir du type func() myInterface requis par factoryFunction. Pour résoudre ce problème :

// Package main
type myInterface interface {
    DoSomething()
}

type myStruct struct{}

func (m *myStruct) DoSomething() {...}

func getInstance() myInterface {
    return &myStruct{}
}
Copier après la connexion

Avec cette modification, getInstance renvoie désormais un type myInterface, lui permettant d'être attribué à factoryFunction.

Remarques supplémentaires :

  • À l'origine, la question impliquait un type de fonction qui renvoyait un pointeur vers la structure plutôt que la structure elle-même, ce qui provoquait le type incompatibilité.
  • Pour implémenter ce comportement dans le code d'origine, une fonction wrapper peut être utilisée :
wrapper := func() myInterface {
    return expensive.CreateInstance()
}
Copier après la connexion

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 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