So beschränken Sie die Schnittstelle{} auf einen bestimmten Typ

WBOY
Freigeben: 2024-02-05 22:57:04
nach vorne
574 Leute haben es durchsucht

So beschränken Sie die Schnittstelle{} auf einen bestimmten Typ

Frageninhalt

Ich verwende go und habe eine Factory-Funktion, die verschiedene Objekttypen basierend auf der angeforderten Kennung zurückgibt:

func newobject(id string) interface{} {
    switch id {
    case "truck":
        return truck{}
    case "car":
        return car{}
    ....
    }
}
Nach dem Login kopieren

Im Folgenden sind die jeweiligen Strukturtypen aufgeführt:

type Truck struct {
    Foo string
}

type Car struct {
    Bar string
}
Nach dem Login kopieren

Wie Sie sehen, haben Lkw und Pkw nichts gemeinsam. Das Problem entsteht, weil ich jetzt anrufe newobject(..) 时必须处理过于宽泛的类型 interface{} . Ich weiß, dass es Generika gibt, aber dazu ist es erforderlich, eine Liste aller unterstützten Typen in einer Typeinschränkung zu führen, was die Dinge in meiner Codebasis komplizierter macht.

Grundsätzlich suche ich hier nach einer Möglichkeit, die Vererbung zu nutzen, was natürlich von go nicht unterstützt wird. Was ist die Alternative?


Richtige Antwort


newobject(..) Funktionen können mit der Unterstützung von Generika implementiert werden. Sie müssen keine Liste aller unterstützten Typen in einer Typeinschränkung führen.

func NewObject[T any](id string) T {
 var vehicle any

 switch id {

 case "truck":
  vehicle = Truck{
   Foo: "foo",
  }
 case "car":
  vehicle = Car{
   Bar: "bar",
  }
 }

 if val, ok := vehicle.(T); ok {
  return val
 }

 var otherVehicle T
 fmt.Printf("Not implemented. Returning with default values for \"%v\"\n", id)
 return otherVehicle
}

Nach dem Login kopieren

Das vollständige Beispiel können Sie hier sehen.

Das obige ist der detaillierte Inhalt vonSo beschränken Sie die Schnittstelle{} auf einen bestimmten Typ. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage