Existe-t-il un moyen de garantir que la valeur transmise comporte certains champs en utilisant des génériques ? C'est un problème que de nombreux développeurs rencontrent souvent lorsqu'ils utilisent des génériques. En PHP, nous pouvons réaliser cette fonction grâce à des contraintes de type et à l'implémentation de l'interface. Premièrement, nous pouvons utiliser des contraintes de type pour garantir que la valeur transmise est une instance d'une classe. Nous pouvons ensuite utiliser des interfaces pour définir des spécifications pour certains champs, en garantissant que la valeur transmise possède ces champs. De cette façon, nous pouvons utiliser des génériques dans notre code et garantir que les valeurs transmises répondent aux exigences spécifiques du champ. De cette manière, nous pouvons mieux tirer parti des génériques et garantir la fiabilité et la sécurité de notre code.
J'essaie de définir une fonction générique en go qui accepte une valeur avec certains champs, comme id int
. J'ai essayé plusieurs méthodes mais aucune ne semble fonctionner. Voici un exemple de ce que j'ai essayé.
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 }
Voici le lien du terrain de jeu : https://gotipplay.golang.org/p/2i4rsucwagf
Dans l'exemple ci-dessus, je veux m'assurer que chaque valeur transmise à la fonction print
possède une propriété print
函数的每个值都有一个属性 id int
,该属性也可以在函数中访问。有什么方法可以在 go 中实现此目的,而无需在接口中定义方法(例如 getid() int
qui est également accessible dans la fonction. Existe-t-il un moyen d'y parvenir sans définir la méthode dans l'interface (par exemple getid() int
) ?
Existe-t-il un moyen d'y parvenir sans définir de méthode dans l'interface (par exemple getid() int) ?
Non, vous devez définir les méthodes dans l'interface.
L'implémentation des génériques dans go 1.18 ne prend pas en charge les types de structure, bien que la proposition de paramètres de type primitif suggère une prise en charge. Pour accéder aux champs publics dans une union, voir aussi cette explication.
Cela dit, je pense qu'il convient de signaler un malentendu qui pourrait facilement surgir de votre exemple : la signification de l'approximation ~t
(type tilde) signifie "l'ensemble des types dont le type de base est t p>".
Maintenant, quand vous écrivez :
~struct{ id int }
Cela signifie que son type sous-jacent est exactement struct{ id int }
. Quoi qu'il en soit, cela n'inclut pas les structures avec des champs struct{ id int }
。无论如何,这不包括具有字段 id int
和其他内容的结构。例如。 type foo struct { id int; 的底层类型;名称字符串 }
是 struct { id int;命名字符串 }
,而不是 struct{ id int }
et d'autres contenus. Par exemple. type foo struct { le type sous-jacent d'id int; nommé string}
est struct { id int; nommé string>
, pas struct{ id int }
, donc la contrainte ne peut pas être satisfaite de toute façon.
L'implémentation actuelle du paramètre de temps n'a pas de syntaxe pour spécifier les types de structure partielle. Je me souviens de la propositiond'ajouter des termes de champ (et des termes et méthodes de type) aux contraintes d'interface), mise en ligne :
type IDer interface { ID int }
Cela permettra d'atteindre ce que vous voulez faire sans détruire le sens du tilde ~
. Mais cela ne sera pas inclus dans go 1.18.
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!