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

source:php.cn
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