Maison > développement back-end > Golang > le corps du texte

Comment convertir une interface en une autre interface qu'elle implémente ?

PHPz
Libérer: 2024-02-13 20:45:08
avant
506 Les gens l'ont consulté

Comment convertir une interface en une autre interface quelle implémente ?

l'éditeur php Strawberry vous présentera comment convertir une interface en une autre interface qu'il implémente. En programmation, une interface est un type abstrait qui définit un ensemble de méthodes, tandis qu'une autre interface est un type concret qui implémente ces méthodes. La conversion d'une interface en une autre interface peut nous aider à étendre les fonctionnalités existantes sans modifier le code d'origine. Cet article expliquera ce processus en détail et fournira des exemples pratiques pour aider les lecteurs à mieux comprendre et appliquer cette technique.

Contenu de la question

En bref - Je veux pouvoir convertir un type d'interface dont le type sous-jacent implémente une interface spécifique vers cette interface spécifique.

J'utilise le package plugin pour trouver une nouvelle fonction et cela ressemble à ceci (j'ai plein d'autres fonctions identiques) :

func newdomainprimarykey() any { return domainprimarykey{} }
Copier après la connexion

(Ceci est généré au moment de l'exécution, je ne peux donc pas simplement le référencer en tant que domainprimarykey)

Ma recherche et mon appel ressemblent à ceci :

                plugin, err := plugin.open("my-plugin")
                if err != nil {
                    return err
                }

                symget, err := plugin.lookup("new" + pluginname)
                if err != nil {
                    return err
                }

                newgenmodel, ok := symget.(func() any)
                if !ok {
                    return errors.new("unexpected type from module symbol")
                }

                anygenmodel := newgenmodel()
                genmodel, ok := anygenmodel.(genmodel) // **this is where the problem is
                if !ok {
                    return errors.new("unexpected type from module symbol")
                }

                genmodelinstance := genmodel.get()
Copier après la connexion

Ci-dessus, j'ai essayé de convertir "anygenmodel" (une interface) en interface "genmodel" qu'il implémente, cependant, cela ne fonctionne pas.

Je suis sûr qu'il implémente cette interface car lorsque je fais ce qui suit, je n'obtiens aucune erreur.

type GenModel interface {
    Get() any
    TableName() string
}

var _ GenModel = (*DomainPrimaryKey)(nil) // this doesn't complain
Copier après la connexion

Que dois-je faire ? J'ai trouvé cet article qui n'est pas ce que je recherche mais qui y ressemble.

Merci d'avance pour toute aide - c'est devenu un véritable obstacle pour moi.

Solution

Si le type sous-jacent implémente ces deux interfaces, c'est très simple :

package main

import "fmt"

type IFace1 interface {
    DoThis()
}

type IFace2 interface {
    DoThat()
}

type impl struct{}

func (i *impl) DoThis() {
    fmt.Println("I implement IFace1")
}

func (i *impl) DoThat() {
    fmt.Println("I implement IFace2")
}

func GetIFace1() IFace1 {
    return &impl{}
}

func main() {
    i1 := GetIFace1()

    i1.DoThis()

    i2 := i1.(IFace2)

    i2.DoThat()
}
Copier après la connexion

Aire de jeux

Si votre code ne fonctionne pas, je remettrais d'abord en question votre affirmation, qui est anygenmodel 的底层类型实际上实现了 genmodel, et je travaillerais à partir de là.

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:stackoverflow.com
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