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 }
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 }
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, }
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, }
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 }
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 }
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!