Maison > développement back-end > Golang > Découvrez comment effectuer une conversion DTO dans Go

Découvrez comment effectuer une conversion DTO dans Go

PHPz
Libérer: 2023-04-11 10:58:28
original
1931 Les gens l'ont consulté

Go est un excellent langage de programmation largement utilisé dans les microservices et le développement Web. Dans les applications Go, la conversion DTO (Data Transfer Object) est un problème courant. Cet article explique comment effectuer une conversion DTO dans Go.

1. Qu'est-ce que DTO

DTO est un modèle de conception général utilisé pour résoudre les problèmes de transmission de données dans les langages de programmation tels que Java et .NET. DTO signifie Data Transfer Object, qui est utilisé pour transférer des données d'une couche à une autre. Les données transférées peuvent provenir d'une base de données, d'un service Web, d'un formulaire Web ou d'une autre source.

DTO contient des attributs de données simples sans aucune logique métier. DTO correspond souvent à la structure de données d'une table de base de données ou d'une autre source de données, de sorte que les noms d'attribut et les types de DTO sont basés sur les champs de base de données et les types de données.

Dans Go, un DTO est une structure qui contient les propriétés d'une table de base de données ou d'une autre source de données. Le DTO doit être léger car il concerne uniquement les données en cours de transfert.

2. Pourquoi DTO est nécessaire

Dans les applications, les données sont généralement stockées dans une base de données et les applications Web doivent ajouter, mettre à jour, supprimer et récupérer des données dans la base de données. Il peut y avoir plusieurs couches dans une application, chacune avec des responsabilités différentes. Par exemple, dans une application Web, il existe une couche qui représente les vues, une couche qui représente la logique métier et une couche qui représente l'accès aux données.

Lors de la transmission de données entre ces couches, les données doivent souvent être converties. Différentes couches peuvent nécessiter différentes structures de données, et DTO peut transmettre des données en utilisant un format de données commun.

DTO offre également un autre avantage, à savoir qu'il peut protéger les modifications du schéma de la base de données. Si le DTO doit être modifié en raison d'une modification du schéma de la base de données, alors seul le DTO doit être modifié et non toutes les couches qui utilisent le DTO.

3. Implémentation de DTO dans Go

Dans Go, DTO peut être facilement implémenté en définissant une structure. Par exemple, disons que nous avons un tableau de comptes d'utilisateurs avec des champs de nom d'utilisateur et de mot de passe. Nous pouvons définir une structure UserDTO comme ceci :

type UserDTO struct {
    Username string
    Password string
}
Copier après la connexion

Lors de la conversion des propriétés d'un DTO en un objet entité, les propriétés de l'objet entité peuvent être définies à l'aide des affectations de champs de structure Go standard. Par exemple, supposons que nous ayons un objet d'entité User :

type User struct {
    ID string
    Username string
    Password string
}
Copier après la connexion

Nous pouvons utiliser le code suivant pour convertir UserDTO en User :

userDTO := UserDTO{
    Username: "testuser",
    Password: "testpassword",
}
user := &User{
    Username: userDTO.Username,
    Password: userDTO.Password,
}
Copier après la connexion

De même, nous pouvons également convertir User en UserDTO :

user := &User{
    ID: "1",
    Username: "testuser",
    Password: "testpassword",
}
userDTO := &UserDTO{
    Username: user.Username,
    Password: user.Password,
}
Copier après la connexion

Le code ci-dessus démontre la conversion de UserDTO vers l'utilisateur et la conversion DTO de l'utilisateur vers l'utilisateur DTO.

4. Utiliser la réflexion pour la conversion DTO

Lorsque le DTO possède un grand nombre d'attributs, effectuer manuellement la conversion DTO peut devenir fastidieux. Dans ce cas, l'utilisation de la réflexion facilite la mise en œuvre de la conversion DTO.

Par exemple, nous pouvons utiliser le code suivant pour effectuer une conversion par réflexion de UserDTO en User :

type UserDTO struct {
    ID string
    Username string
    Password string
}

func (u *UserDTO) ToEntity() (*User, error) {
    user := &User{}
    elem := reflect.ValueOf(user).Elem()

    for i := 0; i < elem.NumField(); i++ {
        field := elem.Type().Field(i)
        tag := field.Tag.Get("json")
        sourceField := reflect.ValueOf(u).Elem().FieldByName(tag)

        if !sourceField.IsValid() {
            continue
        }

        destField := elem.Field(i)

        if !destField.IsValid() {
            continue
        }

        if !destField.CanSet() {
            continue
        }

        destField.Set(sourceField)
    }

    return user, nil
}
Copier après la connexion

Le code ci-dessus utilise la réflexion pour convertir UserDTO en User. Le code crée d'abord un objet User vide, puis utilise la méthode reflex.ValueOf pour obtenir l'élément de l'objet. Le code parcourt ensuite chaque champ de l'objet Utilisateur et vérifie si le champ peut être défini. Si le champ peut être défini, les propriétés correspondantes de l'objet UserDTO sont copiées dans les propriétés correspondantes de l'objet User.

En outre, une méthode similaire peut être utilisée pour convertir User en UserDTO. Par exemple :

type User struct {
    ID string
    Username string
    Password string
}

func (u *User) ToDTO() (*UserDTO, error) {
    userDTO := &UserDTO{}
    elem := reflect.ValueOf(userDTO).Elem()

    for i := 0; i < elem.NumField(); i++ {
        field := elem.Type().Field(i)
        tag := field.Tag.Get("json")
        sourceField := reflect.ValueOf(u).Elem().FieldByName(field.Name)

        if !sourceField.IsValid() {
            continue
        }

        destField := elem.Field(i)

        if !destField.IsValid() {
            continue
        }

        if !destField.CanSet() {
            continue
        }

        destField.Set(sourceField)
    }

    return userDTO, nil
}
Copier après la connexion

Le code ci-dessus utilise une manière similaire pour convertir un objet User en UserDTO.

5. Conclusion

Cet article présente ce qu'est DTO et pourquoi la conversion DTO est nécessaire dans l'application. Cet article montre comment définir DTO dans Go et propose deux façons de convertir DTO en objets d'entité, manuellement et par réflexion. La conversion DTO est un problème souvent rencontré dans les applications Go, l'utilisation de DTO peut rendre le code plus lisible et maintenable.

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