Maison > développement back-end > Golang > le corps du texte

Existe-t-il un moyen de garantir que la valeur transmise comporte certains champs à l'aide de génériques ?

王林
Libérer: 2024-02-10 16:27:22
avant
648 Les gens l'ont consulté

Existe-t-il un moyen de garantir que la valeur transmise comporte certains champs à laide de génériques ?

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.

Contenu de la question

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
}

Copier après la connexion

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) ?

Solution de contournement

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 ".

Maintenant, quand vous écrivez :

~struct{ id int }
Copier après la connexion

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
}
Copier après la connexion

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!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!