Maison >développement back-end >Golang >Go Generics peut-il gérer les paramètres de type dans les définitions de méthodes d'interface ?

Go Generics peut-il gérer les paramètres de type dans les définitions de méthodes d'interface ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-06 10:19:14967parcourir

Can Go Generics Handle Type Parameters in Interface Method Definitions?

Paramètres de type dans les méthodes d'interface : un dilemme des génériques Go

Dans la quête des génériques par Go, une pierre d'achoppement particulière émerge : l'interdiction du type paramètres dans les définitions de méthodes d’interface. Cette restriction, rencontrée par un développeur tentant d'extraire un magasin de clés/valeurs, nous laisse nous demander pourquoi et si une solution existe.

Raison d'être derrière la restriction

The Go L'équipe principale a pris la décision délibérée de concevoir d'interdire les paramètres de type dans les interfaces pour plusieurs raisons :

  1. Interprétation Ambiguïté : Les paramètres de type dans les interfaces pourraient conduire à de multiples interprétations des méthodes, ce qui rend difficile l'établissement de règles de mise en œuvre cohérentes.
  2. Performances au moment de la compilation : Traversée de l'ensemble de la hiérarchie du système de types à le temps de compilation pour résoudre les paramètres de type pourrait avoir un impact significatif sur les performances.
  3. Réflexion d'exécution : Autoriser les paramètres de type dans les interfaces nécessiterait réflexion à l'exécution pour déterminer les paramètres de type réels, ralentissant l'exécution.
  4. Conflits d'implémentation : Les méthodes paramétrées sont essentiellement des fonctions indépendantes, qui pourraient entrer en conflit avec la notion d'implémentation d'interfaces.

Contourner la restriction

Bien que la restriction puisse être frustrant, ce n'est pas insurmontable. La solution proposée dans la proposition Paramètres de type consiste à déplacer le paramètre de type dans la définition du type d'interface elle-même :

type Reader[V Unmarshaler] interface {
    Read(bucket []byte, k ...[]byte) ([][]byte, error)
    ReadDoc(bucket []byte, factory func() (V, error), k ...[]byte) ([]V, error)
}

type Unmarshaler interface {
    UnmarshalKV(v []byte) error
}

Cette approche permet des interfaces génériques de type sécurisé tout en préservant les contraintes de conception du langage.

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:
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