Heim >Backend-Entwicklung >Golang >Wie kann ich mit Go-Funktionen umgehen, die Strukturen zurückgeben, die Schnittstellen implementieren?

Wie kann ich mit Go-Funktionen umgehen, die Strukturen zurückgeben, die Schnittstellen implementieren?

Barbara Streisand
Barbara StreisandOriginal
2024-12-08 04:18:09524Durchsuche

How Can I Handle Go Functions Returning Structs Implementing Interfaces?

Go-Funktionstypen, die Strukturen innerhalb von Schnittstellen zurückgeben

In Go werden häufig Schnittstellen verwendet, um das Verhalten von Strukturen zu definieren. Wenn Sie jedoch mit Funktionen arbeiten, die Strukturen zurückgeben, die Schnittstellen implementieren, können Typsicherheitsfehler auftreten.

Verstehen des Problems

Sehen wir uns das von Ihnen bereitgestellte Codebeispiel an:

package expensive

type myStruct struct { ... } // Struct with time-consuming methods
func CreateInstance() *myStruct { ... } // Expensive factory function
package main

import "expensive"

type myInterface interface { DoSomething() }
type structToConstruct struct { factoryFunction func() myInterface }
func (s *structToConstruct) performAction() { instance := s.factoryFunction(); instance.DoSomething() }

Hier haben Sie eine Factory-Funktion CreateInstance definiert, die eine *myStruct zurückgibt. Anschließend haben Sie eine Schnittstelle „myInterface“ erstellt, die *myStruct implementiert. Sie haben jedoch die Factory-Funktion einem Feld in structToConstruct zugewiesen, das eine Funktion erwartet, die myInterface zurückgibt, was den Kompilierungsfehler verursacht.

Problem lösen

Um dieses Problem zu beheben, müssen Sie haben zwei Optionen:

  1. Wrapper-Funktion: Sie können Ihre Factory-Funktion innerhalb der einschließen Hauptpaket. Zum Beispiel:
wrapper := func() myInterface { return expensive.CreateInstance() }
thing := structToConstruct{wrapper}
  1. Überarbeitete Factory-Funktion: Alternativ können Sie CreateInstance so ändern, dass myInterface direkt zurückgegeben wird:
func CreateInstance() myInterface { return &myStruct{} }

Warum Option 1 funktioniert

In Option 1 ist die Die Wrapper-Funktion konvertiert das Ergebnis von CreateInstance in myInterface, bevor sie es der FactoryFunction zuweist. Dies erfüllt die Typsignatur von structToConstruct, da die Wrapper-Funktion mit dem erwarteten Funktionstyp übereinstimmt.

Warum Option 2 Vorschlag 12754 erfordert

In Option 2, wenn Sie es direkt versuchen Wenn Sie CreateInstance der FactoryFunction zuweisen, wird sich Go beschweren, da CreateInstance einen strukturierten Zeiger und keine Schnittstelle zurückgibt. Vorschlag 12754 schlägt vor, die Sprache zu erweitern, um solche Aufgaben zu unterstützen, wurde jedoch letztendlich abgelehnt.

Das obige ist der detaillierte Inhalt vonWie kann ich mit Go-Funktionen umgehen, die Strukturen zurückgeben, die Schnittstellen implementieren?. 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