Maison > développement back-end > Golang > Golang : accéder aux champs sur 'n'importe quel' type générique

Golang : accéder aux champs sur 'n'importe quel' type générique

WBOY
Libérer: 2024-02-10 10:39:07
avant
924 Les gens l'ont consulté

Golang : accéder aux champs sur nimporte quel type générique

Golang est un langage de programmation typé statiquement qui a toujours attiré beaucoup d'attention dans le processus d'implémentation des génériques. Récemment, l'équipe Golang a réalisé une avancée majeure dans la conception de génériques, permettant aux développeurs d'accéder aux champs de « n'importe quel » type de génériques. Cette nouvelle fonctionnalité apporte une plus grande flexibilité et évolutivité à Golang. Ensuite, nous laisserons l'éditeur PHP Xigua vous présenter en détail les méthodes et les scénarios d'application d'accès aux champs sur "n'importe quel" type générique dans Golang.

Contenu de la question

J'utilise une fonction tierce dont le type générique est any. La fonction renvoie un objet du type qui lui est transmis, et mon propre code s'oppose à ce retour.

J'essaie d'écrire ma propre fonction générique qui accepte un champ HasID 类型的泛型,然后将其传递给第三方函数。但是,当我尝试访问第三方函数返回值的 ID et j'obtiens une erreur.

Que dois-je faire pour saisir cela correctement ?

type HasID struct {
    ID string `json:"id"`
}

func ThirdPartyFunc[T any]() T {
  // do some stuff
  return someThing // of type T
}

func MyFunc[U HasID]() {
  thingWithID := ThirdPartyFunc[U]()
  fmt.Println(thingWithID.ID) // undefined (type U has no field or method ID)
}
Copier après la connexion

Workaround

Je suis d'accord avec le commentaire de @mkopriva, mais je pense que c'est peut-être parce que vous "ne pouvez pas" définir les champs sur la contrainte, vous ne pouvez donc pas accéder à ces champs dans les paramètres de type.

(Probablement pas changé dans Go 1.19, haha)

Pour garder les choses simples, faites comme vous le feriez :

type HasID struct {
    ID string `json:"id"`
}

func MyFunc[U HasID](hasID U) {
    fmt.Println(hasID.ID) // hasID.ID undefined (type U has no field or method ID)

}
Copier après la connexion

https://www.php.cn/link/bddcda5d65fcfdec9de3838794a77265

Mais si vous le définissez comme interface, vous aurez accès à ses méthodes :

type HasID interface {
    ID() string
}

func MyFunc[U HasID](hasID U) {
    fmt.Println(hasID.ID()) // compiles V
}

Copier après la connexion

https://www.php.cn/link/46dfb1fd21d4e16401260f54d2b6a88a

Afin de gérer la structure, vous devez effectuer une conversion de type :

type HasID struct {
    ID string `json:"id"`
}

func MyFunc[U HasID](hasID U) {
    thingWithID := HasID(hasID)
    fmt.Println(thingWithID.ID)
}
Copier après la connexion

P.S - Il y a un numéro ouvert à partir du 02/2022 - https://github .com/golang/go/issues/51259

P.S - Oh, je viens de découvrir... - Comment accéder aux champs de structure (le type T n'a ni champ ni méthode) en utilisant des génériques ?

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