Maison > développement back-end > Golang > Pourquoi une fonction Go renvoyant une structure implémentant une interface ne satisfait-elle pas un champ de fonction renvoyant une interface ?

Pourquoi une fonction Go renvoyant une structure implémentant une interface ne satisfait-elle pas un champ de fonction renvoyant une interface ?

DDD
Libérer: 2024-12-05 12:53:16
original
544 Les gens l'ont consulté

Why Doesn't a Go Function Returning a Struct Implementing an Interface Satisfy an Interface-Returning Function Field?

Types de fonctions Go renvoyant des structures incompatibles avec les interfaces

Question :

Dans Go, pourquoi une fonction renvoyant une structure qui implémente une interface ne satisfait-elle pas à l'exigence de type d'un champ qui attend une fonction renvoyant cela interface ?

Réponse :

Le problème réside dans le fait qu'un type de fonction Go qui renvoie une structure n'est pas interchangeable avec un type de fonction qui renvoie une interface, même si la structure implémente l'interface. Lors de la déclaration d'une signature de type pour une fonction dans une structure, le type de retour spécifique doit correspondre au type déclaré. La modification de la fonction factory pour renvoyer le type d'interface résout directement le problème.

Exemple :

package main

import "fmt"

func main() {
    thing := structToConstruct{getInstance}
    thing.performAction()
}

type myInterface interface {
    doSomething()
}

type structToConstruct struct {
    factoryFunction func() myInterface
}

func (s *structToConstruct) performAction() {
    instance := s.factoryFunction()
    instance.doSomething()
}

func getInstance() myInterface {
    return &myStruct{}
}

type myStruct struct{}

func (m *myStruct) doSomething() {
    fmt.Println("doing something")
}
Copier après la connexion

Dans cet exemple, la fonction factory est modifiée pour renvoyer une instance de myInterface, qui satisfait à l'exigence de type pour structToConstruct.

Explication :

Lors de la déclaration du type structToConstruct, nous spécifions que factoryFunction doit être une fonction qui renvoie une myInterface. Cependant, la fonction coûteuse.CreateInstance renvoie une valeur *myStruct, qui n'est pas directement attribuable à myInterface. En effet, les interfaces Go assurent la sécurité des types et une fonction qui renvoie un type de structure spécifique (par exemple, *myStruct) ne peut pas être automatiquement convertie en une fonction qui renvoie le type d'interface qu'elle implémente.

Pour utiliser *myStruct valeur avec myInterface, nous devons la convertir explicitement en utilisant une assertion de type ou en créant une fonction d'adaptateur qui encapsule la conversion :

func wrapper() myInterface {
    return expensive.CreateInstance()
}

thing := structToConstruct{wrapper}
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal