l'éditeur php Xiaoxin vous propose une introduction aux génériques. Les génériques sont des contraintes et des structures intégrées dans des interfaces qui nous permettent d'être plus flexibles et efficaces lors de l'écriture de code. En utilisant des génériques, nous pouvons trouver et résoudre les erreurs de type au moment de la compilation, améliorant ainsi la lisibilité et la maintenabilité du code. Les génériques peuvent également nous aider à concevoir des structures de données et des algorithmes plus généraux, améliorant ainsi la réutilisabilité du code. Dans cet article, nous approfondirons les concepts, l'utilisation et les applications pratiques des génériques pour vous aider à mieux comprendre et appliquer la programmation générique.
Le code suivant ne peut pas être compilé et signalé ./main.go:35:7: test does not meet constraint (test missing in main.structwithname)
package main import "fmt" type Test struct { Name string } func (t Test) String() string { return fmt.Sprintf("Name: %v", t.Name) } type StructWithName struct { Name string } type Constraint interface { StructWithName // ~struct { // Name string // } String() string } func Print[T Constraint](x T) { //s := T{} fmt.Printf("Hello %v", x) } func main() { t := Test{ Name: "Test", } Print(t) }
Cependant, si je commente le structwithname
et décommente le bloc ~struct, alors il se compile correctement. Je ne comprends pas la différence sémantique entre les deux.
Ce que j'essaie de faire, c'est d'avoir une méthode générique qui peut gérer une structure de manière générique, c'est-à-dire x := s{}
puis de la transmettre à une bibliothèque externe ; Dans ce cas, c'est pour le fournisseur Terraform, le code dans les ressources est très similaire, je suis un peu gêné par la quantité de duplication que je vois dans les fournisseurs existants, dans mon cas les ressources sont très similaires, certaines se situent entre les deux ; structures par défaut (il n'y a qu'un ou deux champs dessus). J'aimerais pouvoir écrire un ensemble de méthodes génériques qui font toutes des choses similaires, et n'ont que les spécificités ailleurs (duh !).
Je n'en suis encore qu'aux premiers stades de mon parcours Go et je n'arrive pas à comprendre les erreurs du compilateur.
Si je comprends bien, ce que vous voulez vraiment n'est pas possible. Les génériques Go ne prennent pas en charge l’accès à un sous-ensemble de champs de structure.
En ce qui concerne les bugs impliqués...
Le nom d'un type spécifie l'identité du type, et deux types avec des noms différents (pas d'alias l'un pour l'autre) sont toujours différents, donc test
et test
和 structwithname
sont deux types différents. La seule chose qu'ils ont en commun est leur type sous-jacent.
type constraint interface { structwithname }
Une interface est un ensemble de types qui contient un seul type, qui est type constraint 接口 { structwithname }
接口是一个仅包含一种类型的类型集,即 structwithname
,并且由于 test
不是该类型集的成员,这意味着不可能使用 test
, et comme test
n'est pas membre de cet ensemble de types, ceci signifie qu'aucun type test
ne peut être utilisé pour satisfaire cette contrainte.
type struct { name string }
是一个无名类型,任何无名类型的底层类型都是该类型本身,即 struct 的底层类型 { name string }
is struct { name string }
est un type sans nom, et le type sous-jacent de tout type sans nom est le type lui-même, c'est-à-dire le type sous-jacent de struct { name string }
~t
,表示任何类型,其底层类型与 t
.
Le tilde devant le type dans la contrainte, c'est-à-dire ~t
, représente
type dont le
type sous-jacent est le même que t
. Ou, plus précisément, struct { name string }
L'ensemble de types d'un élément de la forme
type Constraint interface { ~struct { Name string } }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!