Go ialah bahasa pengaturcaraan yang sangat baik yang digunakan secara meluas dalam perkhidmatan mikro dan pembangunan web. Dalam aplikasi Go, penukaran DTO (Data Transfer Object) ialah masalah biasa. Artikel ini akan meneroka cara melakukan penukaran DTO dalam Go.
1. Apakah itu DTO
DTO ialah corak reka bentuk umum yang digunakan untuk menyelesaikan masalah penghantaran data dalam bahasa pengaturcaraan seperti Java dan .NET. DTO adalah singkatan dari Data Transfer Object dan digunakan untuk memindahkan data dari satu lapisan ke lapisan yang lain. Data yang dipindahkan mungkin data daripada pangkalan data, perkhidmatan web, borang web atau sumber lain.
DTO mengandungi atribut mudah data tanpa sebarang logik perniagaan. DTO selalunya sepadan dengan struktur data jadual pangkalan data atau sumber data lain, jadi nama atribut dan jenis DTO adalah berdasarkan medan pangkalan data dan jenis data.
Dalam Go, DTO ialah struktur yang mengandungi sifat jadual pangkalan data atau sumber data lain. DTO hendaklah ringan kerana ia hanya digunakan untuk memindahkan data.
2. Mengapa DTO diperlukan
Dalam aplikasi, data biasanya disimpan dalam pangkalan data, dan aplikasi web perlu menambah, mengemas kini, memadam dan mendapatkan semula data ke pangkalan data. Mungkin terdapat banyak lapisan dalam aplikasi, masing-masing mempunyai tanggungjawab yang berbeza. Contohnya, dalam aplikasi web, terdapat lapisan yang mewakili pandangan, lapisan yang mewakili logik perniagaan dan lapisan yang mewakili akses data.
Apabila menghantar data antara lapisan ini, data selalunya perlu ditukar. Lapisan yang berbeza mungkin memerlukan struktur data yang berbeza, dan DTO boleh menghantar data menggunakan format data biasa.
DTO juga memberikan faedah lain, iaitu ia dapat melindungi skema pangkalan data daripada perubahan. Jika DTO terpaksa diubah kerana perubahan dalam skema pangkalan data, maka hanya DTO yang perlu diubah dan bukan semua lapisan yang menggunakan DTO.
3. Pelaksanaan DTO dalam Go
Dalam Go, DTO boleh dilaksanakan dengan mudah dengan mentakrifkan struktur. Sebagai contoh, katakan kita mempunyai jadual akaun pengguna dengan medan nama pengguna dan kata laluan. Kita boleh mentakrifkan struct UserDTO seperti ini:
type UserDTO struct { Username string Password string }
Apabila menukar sifat daripada DTO kepada objek entiti, sifat objek entiti boleh ditetapkan menggunakan tugasan medan struct Go standard. Sebagai contoh, katakan kita mempunyai objek entiti Pengguna:
type User struct { ID string Username string Password string }
Kita boleh menggunakan kod berikut untuk menukar UserDTO kepada Pengguna:
userDTO := UserDTO{ Username: "testuser", Password: "testpassword", } user := &User{ Username: userDTO.Username, Password: userDTO.Password, }
Begitu juga, kita juga boleh menukar Pengguna kepada UserDTO :
user := &User{ ID: "1", Username: "testuser", Password: "testpassword", } userDTO := &UserDTO{ Username: user.Username, Password: user.Password, }
Kod di atas menunjukkan penukaran DTO daripada UserDTO kepada Pengguna dan daripada Pengguna kepada UserDTO.
4. Gunakan refleksi untuk penukaran DTO
Apabila DTO mempunyai sejumlah besar atribut, melakukan penukaran DTO secara manual boleh menjadi membosankan. Dalam kes ini, menggunakan refleksi menjadikannya lebih mudah untuk melaksanakan penukaran DTO.
Sebagai contoh, kita boleh menggunakan kod berikut untuk melakukan penukaran pantulan daripada UserDTO kepada Pengguna:
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 }
Kod di atas menggunakan pantulan untuk menukar UserDTO kepada Pengguna. Kod mula-mula mencipta objek Pengguna kosong dan kemudian menggunakan kaedah reflect.ValueOf untuk mendapatkan elem objek. Kod itu kemudiannya menggelung melalui setiap medan objek Pengguna dan menyemak sama ada medan itu boleh ditetapkan. Jika medan boleh ditetapkan, sifat sepadan objek UserDTO akan disalin ke sifat sepadan objek Pengguna.
Selain itu, kaedah yang serupa boleh digunakan untuk menukar Pengguna kepada UserDTO. Contohnya:
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 }
Kod di atas menggunakan cara yang serupa untuk menukar objek Pengguna kepada UserDTO.
5. Kesimpulan
Artikel ini memperkenalkan apa itu DTO dan sebab penukaran DTO diperlukan dalam aplikasi. Artikel ini menunjukkan cara untuk mentakrifkan DTO dalam Go dan menyediakan dua cara untuk menukar DTO kepada objek entiti, secara manual dan melalui refleksi. Penukaran DTO ialah masalah yang sering dihadapi dalam aplikasi Go, menggunakan DTO boleh menjadikan kod lebih mudah dibaca dan diselenggara.
Atas ialah kandungan terperinci Terokai cara melakukan penukaran DTO dalam Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!