Heim > Backend-Entwicklung > Golang > Wie weist man eine Funktion zu, die eine Struktur zurückgibt und eine Schnittstelle in Go implementiert?

Wie weist man eine Funktion zu, die eine Struktur zurückgibt und eine Schnittstelle in Go implementiert?

Barbara Streisand
Freigeben: 2024-12-06 20:28:13
Original
886 Leute haben es durchsucht

How to Assign a Function Returning a Struct Implementing an Interface in Go?

Go-Funktionstypen verwenden, die Strukturen mit Schnittstellen zurückgeben

Frage:

In Go habe ich eine Struktur in einer Paket, das eine Schnittstelle implementiert. In einem anderen abhängigen Paket möchte ich zu Testzwecken eine gefälschte Implementierung dieser Struktur erstellen. Allerdings beschwert sich Go über die Typsicherheit, wenn ich versuche, eine Funktion, die eine Struktur zurückgibt, die die Schnittstelle implementiert, einer Variablen dieser Schnittstelle zuzuweisen.

Architektur:

// Package expensive
type myStruct struct{}

func (m *myStruct) DoSomething() {...}
func (m *myStruct) DoSomethingElse() {...}
func CreateInstance() *myStruct {...} // Expensive to call

// Package main
type myInterface interface {
    DoSomething()
}

type structToConstruct struct {
    factoryFunction func() myInterface
}
func (s *structToConstruct) performAction() {...}
Nach dem Login kopieren

Fehler:

"kosteure.CreateInstance (Typ func()) kann nicht verwendet werden *expensive.myStruct) als Typ func() myInterface im Feldwert"

Antwort:

Das Problem tritt auf, weil die CreateInstance-Funktion einen *myStruct-Wert zurückgibt, der unterschiedlich ist vom Typ func() myInterface, der von der FactoryFunction benötigt wird. Um dieses Problem zu beheben:

// Package main
type myInterface interface {
    DoSomething()
}

type myStruct struct{}

func (m *myStruct) DoSomething() {...}

func getInstance() myInterface {
    return &myStruct{}
}
Nach dem Login kopieren

Mit dieser Änderung gibt getInstance jetzt einen myInterface-Typ zurück, der die Zuweisung zu „factoryFunction“ ermöglicht.

Zusätzliche Hinweise:

  • Ursprünglich ging es bei der Frage um einen Funktionstyp, der einen Zeiger auf die Struktur zurückgab, und nicht auf die Struktur selbst, die den Typ verursachte Nichtübereinstimmung.
  • Um dieses Verhalten im Originalcode zu implementieren, kann eine Wrapper-Funktion verwendet werden:
wrapper := func() myInterface {
    return expensive.CreateInstance()
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie weist man eine Funktion zu, die eine Struktur zurückgibt und eine Schnittstelle in Go implementiert?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage