Inhaltsverzeichnis
Frageninhalt
Workaround
Heim Backend-Entwicklung Golang Wie konvertiert man eine Schnittstelle in eine andere, von ihr implementierte Schnittstelle?

Wie konvertiert man eine Schnittstelle in eine andere, von ihr implementierte Schnittstelle?

Feb 13, 2024 pm 08:45 PM

Wie konvertiert man eine Schnittstelle in eine andere, von ihr implementierte Schnittstelle?

php-Editor Strawberry zeigt Ihnen, wie Sie eine Schnittstelle in eine andere von ihr implementierte Schnittstelle umwandeln. In der Programmierung ist eine Schnittstelle ein abstrakter Typ, der eine Reihe von Methoden definiert, während eine andere Schnittstelle ein konkreter Typ ist, der diese Methoden implementiert. Durch die Konvertierung einer Schnittstelle in eine andere können wir bestehende Funktionen erweitern, ohne den ursprünglichen Code zu ändern. In diesem Artikel wird dieser Prozess ausführlich erläutert und Beispieldemonstrationen bereitgestellt, um den Lesern zu helfen, diese Technik besser zu verstehen und anzuwenden.

Frageninhalt

Kurz gesagt – Ich möchte in der Lage sein, einen Schnittstellentyp, dessen zugrunde liegender Typ eine bestimmte Schnittstelle implementiert, in diese bestimmte Schnittstelle umzuwandeln.

Ich verwende das Plugin-Paket, um eine neue Funktion zu finden, und sie sieht folgendermaßen aus (ich habe viele andere identische Funktionen):

func newdomainprimarykey() any { return domainprimarykey{} }
Nach dem Login kopieren

(Dies wird zur Laufzeit generiert, daher kann ich es nicht einfach als Domänenprimärschlüssel referenzieren)

Meine Suche und mein Anruf sehen so aus:

                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()
Nach dem Login kopieren

Oben habe ich versucht, „anygenmodel“ (eine Schnittstelle) in die von ihr implementierte „genmodel“-Schnittstelle zu konvertieren, aber das funktioniert nicht.

Ich bin sicher, dass diese Schnittstelle implementiert wird, denn wenn ich Folgendes mache, erhalte ich keine Fehler.

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

var _ GenModel = (*DomainPrimaryKey)(nil) // this doesn't complain
Nach dem Login kopieren

Was soll ich tun? Ich habe diesen Artikel gefunden, der nicht das ist, wonach ich suche, der aber ähnlich aussieht.

Vielen Dank im Voraus für jede Hilfe – das ist für mich zu einer echten Hürde geworden.

Workaround

Wenn der zugrunde liegende Typ diese beiden Schnittstellen implementiert, ist es ganz einfach:

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()
}
Nach dem Login kopieren

Spielplatz

Wenn Ihr Code nicht funktioniert, würde ich zunächst Ihre Behauptung in Frage stellen, nämlich anygenmodel 的底层类型实际上实现了 genmodel, und von dort aus arbeiten.

Das obige ist der detaillierte Inhalt vonWie konvertiert man eine Schnittstelle in eine andere, von ihr implementierte Schnittstelle?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße Artikel -Tags

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

GO Language Pack Import: Was ist der Unterschied zwischen Unterstrich und ohne Unterstrich? GO Language Pack Import: Was ist der Unterschied zwischen Unterstrich und ohne Unterstrich? Mar 03, 2025 pm 05:17 PM

GO Language Pack Import: Was ist der Unterschied zwischen Unterstrich und ohne Unterstrich?

Wie kann ich kurzfristige Informationsübertragung zwischen Seiten im BeEGO-Framework implementieren? Wie kann ich kurzfristige Informationsübertragung zwischen Seiten im BeEGO-Framework implementieren? Mar 03, 2025 pm 05:22 PM

Wie kann ich kurzfristige Informationsübertragung zwischen Seiten im BeEGO-Framework implementieren?

Wie schreibe ich Scheinobjekte und Stubs zum Testen in Go? Wie schreibe ich Scheinobjekte und Stubs zum Testen in Go? Mar 10, 2025 pm 05:38 PM

Wie schreibe ich Scheinobjekte und Stubs zum Testen in Go?

Wie kann ich Tracing -Tools verwenden, um den Ausführungsfluss meiner GO -Anwendungen zu verstehen? Wie kann ich Tracing -Tools verwenden, um den Ausführungsfluss meiner GO -Anwendungen zu verstehen? Mar 10, 2025 pm 05:36 PM

Wie kann ich Tracing -Tools verwenden, um den Ausführungsfluss meiner GO -Anwendungen zu verstehen?

Wie konvertieren Sie die Liste der MySQL -Abfrageergebnisse in eine benutzerdefinierte Struktur -Slice in Go -Sprache? Wie konvertieren Sie die Liste der MySQL -Abfrageergebnisse in eine benutzerdefinierte Struktur -Slice in Go -Sprache? Mar 03, 2025 pm 05:18 PM

Wie konvertieren Sie die Liste der MySQL -Abfrageergebnisse in eine benutzerdefinierte Struktur -Slice in Go -Sprache?

Wie kann ich benutzerdefinierte Typ -Einschränkungen für Generika in Go definieren? Wie kann ich benutzerdefinierte Typ -Einschränkungen für Generika in Go definieren? Mar 10, 2025 pm 03:20 PM

Wie kann ich benutzerdefinierte Typ -Einschränkungen für Generika in Go definieren?

Wie schreibe ich Dateien in Go Language bequem? Wie schreibe ich Dateien in Go Language bequem? Mar 03, 2025 pm 05:15 PM

Wie schreibe ich Dateien in Go Language bequem?

Wie kann ich Linter und statische Analyse -Tools verwenden, um die Qualität und Wartbarkeit meines GO -Codes zu verbessern? Wie kann ich Linter und statische Analyse -Tools verwenden, um die Qualität und Wartbarkeit meines GO -Codes zu verbessern? Mar 10, 2025 pm 05:38 PM

Wie kann ich Linter und statische Analyse -Tools verwenden, um die Qualität und Wartbarkeit meines GO -Codes zu verbessern?

See all articles