Heim >Backend-Entwicklung >Golang >Erstellen Sie eine Instanz eines generischen Typs mithilfe eines Zeigers auf einen Typparameter
php-Editor Yuzai stellt in diesem Artikel vor, wie man Zeiger auf Typparameter verwendet, um Instanzen generischer Typen zu erstellen. Generics sind ein in der Programmierung weit verbreitetes Konzept, das es uns ermöglicht, allgemeinen Code zu schreiben, ohne bestimmte Typen anzugeben. Obwohl es in PHP keine native Unterstützung für Generika gibt, können wir Generika simulieren, indem wir Zeiger auf Typparameter verwenden. Diese Methode kann uns beim Schreiben von Code flexibler und effizienter machen und die Wiederverwendbarkeit und Wartbarkeit von Code verbessern. Im folgenden Inhalt werden wir detailliert beschreiben, wie diese Methode zum Erstellen von Instanzen generischer Typen verwendet wird, und einige Beispiele für praktische Anwendungen geben.
Angesichts dieser Typdefinitionen:
type n interface{ ~int | ~float32 | ~float64 } type s[t any] struct { t t } type myint int type pspmyint[t myint] *s[*t] type spmyint[t *myint,] s[t] type spmyint2[t myint] s[*t]
Ich kann eine Variante von type pspmyint
func createps[t myint]() pspmyint[t] { var i t s := s[*t]{t: &i} return &s }
Aber ich weiß nicht, wie ich die Variable von spmyint
或 spmyint2
erstellen soll.
Das
func createSP[T myInt]() spMyInt2[T] { var i T s := S[*T]{t: &i} return s }
Kompilierung fehlgeschlagen
Sie können s (eine Variable vom Typ s[*t]) nicht als Typ spmyint2[t] in einer Return-Anweisung verwenden.
不能在return语句中使用s(s[*t]类型的变量)作为spmyint2[t]类型。
首先,不要使用精确类型参数约束。这几乎没有任何意义。当您将函数声明为 createps[t myint]()
时,类型参数类型集的基数为 1,因此可以有效地由 myint
LösungZuallererst: Verwenden Sie keine genauen Typparametereinschränkungen. Das macht fast keinen Sinn. Wenn Sie eine Funktion als createps[t myint]()
deklarieren, hat der Typparametertypsatz die Kardinalität 1, sodass er effektiv durch myint
nur
instanziiert werden kann Für immer
. Sie können die Funktion folgendermaßen umschreiben:
65bee32705632
s[*t]
与 spmyint2[t]
不同。但是,由于 spmyint2[t]
的底层类型是 s[*t]
Lösung für dieses Problem:
Typ s[*t]
type spmyint[t *myint,] s[t]
unterscheidet sich
spmyint2[t]
. Da der zugrunde liegende Typ von spmyint2[t]
jedoch s[*t]
ist, können Sie einfach Folgendes konvertieren: 65bee32705638 Was betrifft (wobei das Komma kein Tippfehler ist, sondern benötigt wird, um Mehrdeutigkeiten beim Parsen zu vermeiden), sind die Dinge nicht so einfach.
Das Problem besteht darin, dass die Typparameter spmyint[t *myint]
有一个类型参数约束为 *myint
并且函数 t
受基本类型 myint
约束,因此 *t
应该满足 phpcnc phpcnt * myint。这是不正确的,因为类型文字 *t
不等于 *myint
的明显不明显的原因。所以实际上你不能为 type spmyint[t *myint,] s[t]
nicht
// naive attempt that doesn't compile func createsp1[t myint]() spmyint[*t] { var i t s := s[*t]{t: &i} return spmyint[*t](s) }Sie könnten denken, dass
spmyint[t *myint]
einen Typparameter hat, der auf *myint
beschränkt ist, und dass die Funktion t
durch die Basis gebunden ist Typ myint-Einschränkung, <em>daher</em> <code>*t
sollte phpcnc phpcnt * myint erfüllen. Dies ist aus scheinbar nicht offensichtlichen Gründen falsch, da das Typliteral *t
nicht gleich *myint
ist. Eigentlich kann man also keinen universellen Konstruktor für 🎜 schreiben. 🎜
🎜Aber Sie haben Glück, denn die Typbeschränkung hat die Kardinalität eins. Sie können also den Typparameter entfernen: 🎜
func createSP1() spMyInt[*myInt] { var i myInt s := S[*myInt]{t: &i} return spMyInt[*myInt](s) }
Das obige ist der detaillierte Inhalt vonErstellen Sie eine Instanz eines generischen Typs mithilfe eines Zeigers auf einen Typparameter. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!