Maison > développement back-end > Golang > Pourquoi une fonction Go renvoyant un pointeur Struct n'implémente-t-elle pas automatiquement une interface ?

Pourquoi une fonction Go renvoyant un pointeur Struct n'implémente-t-elle pas automatiquement une interface ?

Linda Hamilton
Libérer: 2024-12-20 13:13:13
original
323 Les gens l'ont consulté

Why Doesn't a Go Function Returning a Struct Pointer Automatically Implement an Interface?

Implémentation d'interface dans Go : types de fonctions renvoyant des structures

Lorsque vous travaillez avec Go, il est courant de rencontrer des situations où une fonction renvoie une structure qui implémente une interface. Cependant, vous pouvez rencontrer une erreur similaire à « Impossible d'utiliser [fonction] comme type [interface] dans la valeur du champ » lorsque vous tentez d'attribuer la fonction à un champ qui attend une instance de l'interface.

Pour comprendre cela erreur, il est crucial de préciser qu'une fonction qui renvoie un pointeur vers une structure (struct) n'implémente pas automatiquement une interface définie pour cette structure. En d'autres termes, struct et struct sont des types distincts dans Go.

Dans l'exemple donné, la fonction getInstance devrait renvoyer une valeur de type myInterface, qui est une description du comportement (interface) plutôt qu'une implémentation spécifique (struct). Cependant, getInstance renvoie un pointeur vers l'implémentation myStruct (*myStruct), qui n'est pas compatible de type avec myInterface.

Pour résoudre ce problème, vous devez modifier getInstance pour renvoyer une instance du myStruct struct, comme le montre le code corrigé ci-dessous :

package main

import "fmt"

func main() {
    var function func() myInterface

    function = getInstance

    newSomething := function()

    newSomething.doSomething()
}

type myInterface interface {
    doSomething()
}

type myStruct struct{}

func (m *myStruct) doSomething() {
    fmt.Println("doing something")
}

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

Cette modification garantit que myStruct implémente l'interface myInterface et l'interface myStruct. La fonction

getInstance

renvoie le bon type.

Bien que l'approche ci-dessus fonctionne, Go a proposé un changement de langage pour convertir automatiquement une fonction renvoyant un type concret en une fonction renvoyant une interface si le type concret implémente l'interface. Cependant, cette proposition a été rejetée en raison de problèmes potentiels de performances et de sécurité.

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