Maison > développement back-end > Golang > Comment puis-je créer une fonction Go générique qui accepte un pointeur vers une implémentation d'interface ?

Comment puis-je créer une fonction Go générique qui accepte un pointeur vers une implémentation d'interface ?

Mary-Kate Olsen
Libérer: 2024-12-21 05:25:14
original
110 Les gens l'ont consulté

How Can I Create a Generic Go Function That Accepts a Pointer to an Interface Implementation?

Implémentation d'un pointeur générique vers une interface

Dans Go, définir une fonction générique qui accepte un pointeur vers une interface peut être difficile. Considérons une interface A avec un SomeMethod() :

type A interface {
  SomeMethod()
}
Copier après la connexion

Et supposons qu'il existe une implémentation de A en tant que pointeur de structure :

type Aimpl struct {}

func (a *Aimpl) SomeMethod() {}
Copier après la connexion

Pour créer un gestionnaire de fonction générique qui prend une fonction avec un paramètre A, il serait souhaitable de définir :

func Handler[T A](callback func(result T)) {
  // Essentially what I'd like to do is result := &Aimpl{} (or whatever T is)
  callback(result)
}
Copier après la connexion

Il existe cependant quelques contraintes à considérer.

Tentative avec n'importe quel paramètre de type

Au départ, il peut sembler possible de définir une interface avec un paramètre de type pour permettre les implémentations de pointeurs :

type MyA[T any] interface{
  A
  *T
}
Copier après la connexion

Cependant, cela échoue avec l'erreur suivante :

result does not implement interface. It's a pointer to a type, not a type
Copier après la connexion

Solution : Type Interface paramétrée

Pour surmonter cela, l'interface peut être déclarée avec un paramètre de type qui nécessite que le type d'implémentation soit un pointeur vers son paramètre de type :

type A[P any] interface {
    SomeMethod()
    *P
}
Copier après la connexion

Avec cette interface , la fonction Handler peut être modifiée :

func Handler[P any, T A[P]](callback func(result T)) {
    result := new(P)
    callback(result)
}
Copier après la connexion

Maintenant, le code peut appeler Handler comme attendu :

Handler(func(a *Aimpl) { fmt.Printf("%#v\n", a) })
Copier après la connexion

Alternative avec Interface Wrapper

Si la définition de A ne peut pas être modifiée, une approche alternative consiste à l'envelopper dans une interface personnalisée :

type MyA[P any] interface {
    A
    *P
}
Copier après la connexion

Et modifiez la fonction Handler en conséquence :

func Handler[P any, T MyA[P]](callback func(result T)) {
    result := new(P)
    callback(result)
}
Copier après la connexion

Les deux solutions permettent de créer des fonctions génériques qui acceptez les pointeurs vers les implémentations d’interface.

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!

source:php.cn
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal