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
Barbara StreisandOriginal
2024-12-06 20:28:13907Durchsuche

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() {...}

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{}
}

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()
}

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!

Stellungnahme:
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