Go ist eine hervorragende Programmiersprache, die häufig in Microservices und Webentwicklung verwendet wird. In Go-Anwendungen ist die DTO-Konvertierung (Data Transfer Object) ein häufiges Problem. In diesem Artikel erfahren Sie, wie Sie die DTO-Konvertierung in Go durchführen.
1. Was ist DTO?
DTO ist ein allgemeines Entwurfsmuster, das zur Lösung von Datenübertragungsproblemen in Programmiersprachen wie Java und .NET verwendet wird. DTO steht für Data Transfer Object und wird zum Übertragen von Daten von einer Schicht zur anderen verwendet. Bei den übertragenen Daten kann es sich um Daten aus einer Datenbank, einem Webdienst, einem Webformular oder einer anderen Quelle handeln.
DTO enthält einfache Datenattribute ohne Geschäftslogik. DTO entspricht häufig der Datenstruktur einer Datenbanktabelle oder einer anderen Datenquelle, daher basieren die Attributnamen und -typen von DTO auf den Datenbankfeldern und Datentypen.
In Go ist DTO eine Struktur, die Eigenschaften einer Datenbanktabelle oder einer anderen Datenquelle enthält. Das DTO sollte leichtgewichtig sein, da es nur zur Datenübertragung verwendet wird.
2. Warum benötigen Sie DTO
In Anwendungen erfolgt die Datenspeicherung normalerweise in einer Datenbank, und Webanwendungen müssen Daten zur Datenbank hinzufügen, aktualisieren, löschen und abrufen . Eine Anwendung kann viele Ebenen mit jeweils unterschiedlichen Verantwortlichkeiten umfassen. Beispielsweise gibt es in einer Webanwendung eine Ebene, die Ansichten darstellt, eine Ebene, die Geschäftslogik darstellt, und eine Ebene, die den Datenzugriff darstellt.
Bei der Übertragung von Daten zwischen diesen Schichten müssen die Daten häufig konvertiert werden. Unterschiedliche Schichten erfordern möglicherweise unterschiedliche Datenstrukturen, und DTO kann Daten in einem gemeinsamen Datenformat übertragen.
DTO bietet außerdem einen weiteren Vorteil: Es kann das Datenbankschema vor Änderungen schützen. Wenn das DTO aufgrund einer Änderung im Datenbankschema geändert werden muss, muss nur das DTO geändert werden und nicht alle Schichten, die das DTO verwenden.
3. DTO-Implementierung in Go
In Go kann DTO einfach durch Definition einer Struktur implementiert werden. Nehmen wir zum Beispiel an, wir haben eine Benutzerkontentabelle mit Feldern für Benutzername und Passwort. Wir können eine UserDTO-Struktur wie folgt definieren:
type UserDTO struct { Username string Password string }
Beim Konvertieren von Eigenschaften von einem DTO in ein Entitätsobjekt können Sie die Standardfeldzuweisung von Go-Strukturen verwenden, um die Eigenschaften des Entitätsobjekts festzulegen. Angenommen, wir haben ein User-Entitätsobjekt:
type User struct { ID string Username string Password string }
Wir können den folgenden Code verwenden, um UserDTO in User zu konvertieren:
userDTO := UserDTO{ Username: "testuser", Password: "testpassword", } user := &User{ Username: userDTO.Username, Password: userDTO.Password, }
Ähnlich können wir auch User in UserDTO konvertieren :
user := &User{ ID: "1", Username: "testuser", Password: "testpassword", } userDTO := &UserDTO{ Username: user.Username, Password: user.Password, }
Der obige Code demonstriert die DTO-Konvertierung von UserDTO zu User und von User zu UserDTO.
4. Verwenden Sie Reflection für die DTO-Konvertierung
Die manuelle Durchführung der DTO-Konvertierung kann mühsam sein, wenn das DTO über eine große Anzahl von Attributen verfügt. In diesem Fall erleichtert die Verwendung von Reflektion die Implementierung der DTO-Konvertierung.
Zum Beispiel können wir den folgenden Code verwenden, um eine Reflection-Konvertierung von UserDTO in User durchzuführen:
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 }
Der obige Code verwendet Reflection, um UserDTO in User zu konvertieren. Der Code erstellt zunächst ein leeres Benutzerobjekt und verwendet dann die Methode „reflect.ValueOf“, um das Element des Objekts abzurufen. Der Code durchläuft dann jedes Feld des Benutzerobjekts und prüft, ob das Feld festgelegt werden kann. Wenn das Feld festgelegt werden kann, werden die entsprechenden Eigenschaften des UserDTO-Objekts in die entsprechenden Eigenschaften des User-Objekts kopiert.
Darüber hinaus können Sie eine ähnliche Methode auch zum Konvertieren von User in UserDTO verwenden. Zum Beispiel:
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 }
Der obige Code verwendet eine ähnliche Methode, um das User-Objekt in UserDTO zu konvertieren.
5. Fazit
In diesem Artikel wird erläutert, was DTO ist und warum eine DTO-Konvertierung in der Anwendung erforderlich ist. Dieser Artikel zeigt, wie man DTO in Go definiert, und bietet zwei Möglichkeiten, DTO in Entitätsobjekte zu konvertieren, manuell und durch Reflektion. Die DTO-Konvertierung ist ein Problem, das häufig in Go-Anwendungen auftritt. Durch die Verwendung von DTO kann der Code lesbarer und wartbarer werden.
Das obige ist der detaillierte Inhalt vonErfahren Sie, wie Sie eine DTO-Konvertierung in Go durchführen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!