Maison >développement back-end >Golang >Comment gérer les fonctions de structures Go similaires avec des champs partagés ?

Comment gérer les fonctions de structures Go similaires avec des champs partagés ?

DDD
DDDoriginal
2024-10-29 04:52:02260parcourir

How to Manage Functions for Similar Go Structs with Shared Fields?

Meilleures pratiques Go : gestion des fonctions pour des structures similaires avec des champs partagés

Dans Go, il est courant de rencontrer plusieurs structures avec des champs similaires, et il est nécessaire d'effectuer des opérations identiques sur eux. Pour éviter la répétition du code tout en conservant la flexibilité, envisagez les stratégies suivantes :

Création d'un type personnalisé pour le champ partagé :

Si le champ partagé est un type de données simple ( par exemple, une chaîne), envisagez de définir un type personnalisé pour celui-ci. Cela vous permet d'attacher des méthodes au type personnalisé, qui peuvent ensuite être utilisées par n'importe quelle structure qui intègre ce type.

<code class="go">type Version string

func (v Version) PrintVersion() {
    fmt.Println("Version is", v)
}</code>

Ensuite, intégrez le type Version dans les structures :

<code class="go">type Game struct {
    Name               string
    MultiplayerSupport bool
    Genre              string
    Version
}

type ERP struct {
    Name               string
    MRPSupport         bool
    SupportedDatabases []string
    Version
}</code>

Cela permet d'imprimer la version en utilisant la méthode PrintVersion sur le champ Version :

<code class="go">g.PrintVersion()
e.PrintVersion()</code>

Utilisation de Reflection :

Si le champ partagé peut être de différents types ou si vous souhaitez plus de flexibilité, vous pouvez utiliser la réflexion pour appeler dynamiquement la méthode appropriée. Cette approche est plus complexe et a certaines implications en termes de performances, mais elle offre une plus grande flexibilité.

<code class="go">type Printer interface {
    PrintVersion() error
}

func PrintVersion(p Printer) error {
    t := reflect.TypeOf(p)
    method, ok := t.MethodByName("PrintVersion")
    if !ok {
        return fmt.Errorf("object doesn't have a PrintVersion method")
    }

    return method.Func.Call([]reflect.Value{reflect.ValueOf(p)})[0].Interface().(error)
}</code>

Vous pouvez ensuite utiliser la fonction PrintVersion pour appeler la méthode PrintVersion sur n'importe quel objet qui implémente l'interface de l'imprimante :

<code class="go">var game Game
var erp ERP

PrintVersion(game)
PrintVersion(erp)</code>

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