Maison >développement back-end >Golang >Comment les génériques de Go peuvent-ils gérer des fonctions avec des paramètres d'interface basés sur un pointeur ?

Comment les génériques de Go peuvent-ils gérer des fonctions avec des paramètres d'interface basés sur un pointeur ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-29 00:36:09134parcourir

How Can Generics in Go Handle Functions with Pointer-Based Interface Parameters?

Interface générique des pointeurs

Dans Go, la définition d'une interface pour l'implémentation d'un pointeur peut se faire via des génériques. Considérons le scénario suivant :

Problème :

  • Vous avez une interface A avec une méthode SomeMethod().
  • Vous avez une struct pointeur *Aimpl qui implémente l'interface A.
  • Vous souhaitez créer un gestionnaire de fonction générique qui accepte une fonction avec un A paramètre et attribue un pointeur vers Aimpl à son paramètre.

Solution utilisant une interface générique avec un paramètre de type :

Pour y parvenir, vous pouvez déclarer le A interface avec un paramètre de type, en garantissant que le type d'implémentation est un pointeur vers son paramètre de type :

type A[P any] interface {
    SomeMethod()
    *P
}

Ensuite, modifiez la signature de Handler comme suit :

func Handler[P any, T A[P]](callback func(result T)) {
    result := new(P)
    callback(result)
}

Solution utilisant l'interface Wrapper :

Si vous ne pouvez pas modifier la définition de A, vous pouvez l'envelopper dans votre propre interface MyA :

type MyA[P any] interface {
    A
    *P
}

Ensuite, mettez à jour la signature de Handler pour utiliser l'interface MyA :

func Handler[P any, T MyA[P]](callback func(result T)) {
    result := new(P)
    callback(result)
}

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