Gibt es eine Möglichkeit, mithilfe von Generika sicherzustellen, dass der übergebene Wert bestimmte Felder enthält?

王林
Freigeben: 2024-02-10 16:27:22
nach vorne
650 Leute haben es durchsucht

Gibt es eine Möglichkeit, mithilfe von Generika sicherzustellen, dass der übergebene Wert bestimmte Felder enthält?

Gibt es eine Möglichkeit, mithilfe von Generika sicherzustellen, dass der übergebene Wert bestimmte Felder enthält? Dies ist ein Problem, auf das viele Entwickler häufig stoßen, wenn sie Generika verwenden. In PHP können wir diese Funktion durch Typeinschränkungen und Schnittstellenimplementierung erreichen. Erstens können wir Typeinschränkungen verwenden, um sicherzustellen, dass der übergebene Wert eine Instanz einer Klasse ist. Über die Schnittstelle können wir dann Spezifikationen für bestimmte Felder definieren und so sicherstellen, dass der übergebene Wert diese Felder enthält. Auf diese Weise können wir Generika in unserem Code verwenden und sicherstellen, dass die übergebenen Werte bestimmte Feldanforderungen erfüllen. Auf diese Weise können wir die Vorteile von Generika besser nutzen und die Zuverlässigkeit und Sicherheit unseres Codes gewährleisten.

Frageninhalt

Ich versuche, in go eine generische Funktion zu definieren, die einen Wert mit einigen Feldern akzeptiert, z. B. id int. Ich habe mehrere Methoden ausprobiert, aber keine scheint zu funktionieren. Hier ist ein Beispiel dafür, was ich versucht habe.

package main

import (
    "fmt"
)

func Print[T IDer](s T) {
    fmt.Print(s.ID)
}

func main() {
    Print(Person{3, "Test"})
}

type IDer interface {
    ~struct{ ID int }
}

type Person struct {
    ID   int
    Name string
}

type Store struct {
    ID     int
    Domain string
}

Nach dem Login kopieren

Dies ist der Spielplatz-Link: https://gotippplay.golang.org/p/2i4rsucwagf

Im obigen Beispiel möchte ich sicherstellen, dass jeder an die Funktion print übergebene Wert eine Eigenschaft print 函数的每个值都有一个属性 id int,该属性也可以在函数中访问。有什么方法可以在 go 中实现此目的,而无需在接口中定义方法(例如 getid() int hat, auf die auch innerhalb der Funktion zugegriffen werden kann. Gibt es eine Möglichkeit, dies in go zu erreichen, ohne die Methode in der Schnittstelle zu definieren (z. B. getid() int)?

Workaround

Gibt es eine Möglichkeit, dies in go zu erreichen, ohne eine Methode in der Schnittstelle zu definieren (z. B. getid() int)?

Nein, Sie müssen die Methoden in der Schnittstelle definieren.

Die generische Implementierung in go 1.18 unterstützt keine Strukturtypen, obwohl der Vorschlag für primitive Typparameter eine Unterstützung nahelegt. Informationen zum Zugriff auf öffentliche Felder in einer Union finden Sie auch diese Erklärung.

Trotzdem denke ich, dass es sich lohnt, auf ein Missverständnis hinzuweisen, das leicht aus Ihrem Beispiel entstehen könnte: Die Bedeutung von Approximation ~t (Tilde-Typ) bedeutet „die Menge von Typen, deren Basistyp t ist.“ Wenn du jetzt schreibst:

~struct{ id int }
Nach dem Login kopieren

Das bedeutet, dass der zugrunde liegende Typ

genau struct{ id int ist. Dies schließt jedenfalls keine Strukturen mit Feldern undanderem Zeug ein. Zum Beispiel. type foo struct { zugrunde liegender Typ der ID int; benannter String ist struct { id int; benannter String, nicht struct{ id int } , sodass die Einschränkung ohnehin nicht erfüllt werden kann. struct{ id int }。无论如何,这不包括具有字段 id int 其他内容的结构。例如。 type foo struct { id int; 的底层类型;名称字符串 }struct { id int;命名字符串 },而不是 struct{ id int }

Die aktuelle Zeitparameterimplementierung verfügt nicht über eine Syntax zum Angeben von Teilstrukturtypen. Ich erinnere mich an den

Vorschlag, Feldbegriffe (sowie Typbegriffe und Methoden) zu Schnittstellenbeschränkungen hinzuzufügen), der live ging:

type IDer interface {
    ID int
}
Nach dem Login kopieren
Damit erreichen Sie das, was Sie erreichen möchten, ohne die Bedeutung der Tilde zu zerstören

. Dies wird jedoch nicht in go 1.18 enthalten sein. ~

Das obige ist der detaillierte Inhalt vonGibt es eine Möglichkeit, mithilfe von Generika sicherzustellen, dass der übergebene Wert bestimmte Felder enthält?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
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
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!