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
Freigeben: 2024-12-08 04:18:09
Original
490 Leute haben es durchsucht

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
Nach dem Login kopieren
package main

import "expensive"

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

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}
Nach dem Login kopieren
  1. Überarbeitete Factory-Funktion: Alternativ können Sie CreateInstance so ändern, dass myInterface direkt zurückgegeben wird:
func CreateInstance() myInterface { return &myStruct{} }
Nach dem Login kopieren

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!

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