Maison >développement back-end >Golang >Comment définir une fonction générique à l'aide d'une structure personnalisée sans lister toutes les structures ?

Comment définir une fonction générique à l'aide d'une structure personnalisée sans lister toutes les structures ?

PHPz
PHPzavant
2024-02-09 20:30:10816parcourir

Comment définir une fonction générique à laide dune structure personnalisée sans lister toutes les structures ?

En PHP, si l'on souhaite utiliser des structures personnalisées pour définir des fonctions communes sans avoir à lister toutes les structures, il existe un moyen efficace de le faire. Cette approche est réalisée en utilisant un nombre variable de paramètres. Nous pouvons accepter n'importe quel nombre de paramètres en utilisant des points de suspension (...) comme noms de paramètres dans la définition de la fonction. Dans le corps de la fonction, nous pouvons utiliser la fonction func_get_args() pour obtenir tous les arguments transmis à la fonction. De cette façon, nous pouvons utiliser ces paramètres à l’intérieur de la fonction sans définir toutes les structures à l’avance. Cette approche flexible peut nous aider à écrire des fonctions plus générales et réutilisables et à améliorer l'efficacité du codage.

Contenu de la question

Supposons que j'ai deux structures différentes :

type one struct {
  id string
  // other fields
}

type two struct {
  id string
  // other fields
}

Est-il possible de définir une fonction qui accepte les deux onetwo sans les lister explicitement comme options ?

Par exemple, je recherche quelque chose comme ceci :

type ModelWithId struct {
  Id string
}

func Test[M ModelWithId](m M) {
  fmt.PrintLn(m.Id)
}

one := One { Id: "1" }
Test(one) // Prints 1

Je ne veux pas utiliser functest[m one |两个](m m) parce que je pourrais avoir plus de 10 structures et je ne veux pas avoir à revenir à cette fonction à chaque fois que j'ajoute une nouvelle structure à la base de code.

Solution

Les génériques utilisent des méthodes pour contraindre le comportement des paramètres de type, vous devez donc réécrire votre code comme :

type one struct {
    id string
}

func (o *one) id() string {
    return o.id
}

Alors votre site d'utilisation deviendra :

type ModelWithId interface {
    Id() string
}

func Test[M ModelWithId](m M) {
    fmt.Println(m.Id())
}

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