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.
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 }
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
)?
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.“
p>Wenn du jetzt schreibst:
~struct{ id int }
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 }
type IDer interface { ID int }
. 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!