Maison  >  Article  >  développement back-end  >  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
WBOYavant
2024-02-10 10:39:07884parcourir

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

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)

}

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
}

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

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer