Maison >développement back-end >Golang >Comment puis-je gérer les fonctions Go renvoyant des structures implémentant des interfaces ?

Comment puis-je gérer les fonctions Go renvoyant des structures implémentant des interfaces ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-08 04:18:09519parcourir

How Can I Handle Go Functions Returning Structs Implementing Interfaces?

Types de fonctions Go qui renvoient des structures à l'intérieur des interfaces

Dans Go, il est courant d'utiliser des interfaces pour définir le comportement des structures. Cependant, lorsque vous travaillez avec des fonctions qui renvoient des structures qui implémentent des interfaces, vous pouvez rencontrer des erreurs de sécurité de type.

Comprendre le problème

Examinons l'exemple de code que vous avez fourni :

package expensive

type myStruct struct { ... } // Struct with time-consuming methods
func CreateInstance() *myStruct { ... } // Expensive factory function
package main

import "expensive"

type myInterface interface { DoSomething() }
type structToConstruct struct { factoryFunction func() myInterface }
func (s *structToConstruct) performAction() { instance := s.factoryFunction(); instance.DoSomething() }

Ici, vous avez défini une fonction d'usine CreateInstance qui renvoie un *myStruct. Vous avez ensuite créé une interface myInterface que *myStruct implémente. Cependant, vous avez attribué la fonction d'usine à un champ dans structToConstruct qui attend une fonction renvoyant myInterface, provoquant l'erreur de compilation.

Résoudre le problème

Pour résoudre ce problème, vous avez deux options :

  1. Fonction Wrapper : Vous pouvez envelopper votre fonction d'usine dans le paquet principal. Par exemple :
wrapper := func() myInterface { return expensive.CreateInstance() }
thing := structToConstruct{wrapper}
  1. Fonction Factory révisée : Vous pouvez également modifier CreateInstance pour renvoyer directement myInterface :
func CreateInstance() myInterface { return &myStruct{} }

Pourquoi l'option 1 fonctionne

Dans l'option 1, le wrapper La fonction convertit le résultat de CreateInstance en myInterface avant de l'attribuer à factoryFunction. Cela satisfait la signature de type de structToConstruct car la fonction wrapper correspond au type de fonction attendu.

Pourquoi l'option 2 nécessite la proposition 12754

Dans l'option 2, si vous essayez de directement attribuez CreateInstance à factoryFunction, Go se plaindra car CreateInstance renvoie un pointeur structuré, pas une interface. La proposition 12754 suggère d'étendre le langage pour prendre en charge de telles affectations, mais elle a finalement été rejetée.

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