拋磚引玉:拷貝物件,CopyObject
比如有這樣的需求:把呼叫第三方的 SDK 拿到的使用者資料錄入我們自己的資料庫中,但是兩邊的使用者資料結構類似,但並不一樣.
比如第三方的使用者資料結構是這樣的:
type User2 struct {
Id int
Username string
Age int
Address string
}
而我們儲存的使用者資料結構是這樣的:
type User1 struct {
Id int
Username string
Age int
}
我之前傻傻的做法是這樣的:
var u2 = User2{
Username: "這是使用者名稱",
Id: 1,
Age: 100,
Address: "這是地址",
}
var u1 = User1{
Id:u2.Id,
Username:u2.Username,
Age:u2.Age,
}
也就是逐個欄位對比,然後賦值。但是後來發現,如果我們之前不需要的Address
欄位,現在又需要了,那麼除了改User1
的結構之外,還要再修改賦值的地方。欄位少的時候,這個還好處理,但是很多時候,這類的欄位很多,就容易出差錯了,比如遺漏了某個欄位。
後來我想了個辦法,使用 reflect 進行賦值。程式碼如下:
package main
import (
"fmt"
"reflect"
)
type User1 struct {
Id int
Username string
Age int
}
type User2 struct {
Id int
Username string
Age int
Address string
}
func main() {
var u2 = User2{
Username: "這是使用者名稱",
Id: 1,
Age: 100,
Address: "這是地址",
}
var u1 = User1{}
CopyObject(&u2, &u1)
fmt.Printf("%+v\n", u1)
}
type ReflectVal struct {
T reflect.Type
V reflect.Value
}
func CopyObject(src, dst interface{}) {
var srcMap = make(map[string]ReflectVal)
vs := reflect.ValueOf(src)
ts := reflect.TypeOf(src)
vd := reflect.ValueOf(dst)
td := reflect.TypeOf(dst)
ls := vs.Elem().NumField()
for i := 0; i < ls; i++ {
fmt.Println(ts.Elem().Field(i).Name, vs.Elem().Field(i), vs.Elem().Field(i).Type())
srcMap[ts.Elem().Field(i).Name] = ReflectVal{
T: vs.Elem().Field(i).Type(),
V: vs.Elem().Field(i),
}
}
ld := vd.Elem().NumField()
for i := 0; i < ld; i++ {
n := td.Elem().Field(i).Name
t := vd.Elem().Field(i).Type()
if v, ok := srcMap[n]; ok && v.T == t && vd.Elem().Field(i).CanSet() {
vd.Elem().Field(i).Set(v.V)
}
}
}
這樣看起來,好像可以了。但是又有新的問題了,比如第三方的使用者資料中的Username
,其實對應我們的RealName
,也就是欄位名不同,這個就需要通過struct
的tag
去進行對映處理。那麼還有新問題,如果都是Username
,但是第三方的是*string
型別,而我們的是string
型別呢?
我把磚頭丟擲來了,希望大家把自己的玉獻出來觀摩參考參考。感覺這樣的需求還是經常遇到
更多原創文章乾貨分享,請關注公眾號
- 加微信實戰群請加微信(註明:實戰群):gocnio
相關文章
- Flutter解析複雜JSON泛型方案--拋磚引玉篇FlutterJSON泛型
- 物件深拷貝和淺拷貝物件
- 分享一下自己的簡歷, 拋磚引玉歡迎討論
- 實現物件淺拷貝、深拷貝物件
- 聊聊物件深拷貝和淺拷貝物件
- jquery之物件拷貝深拷貝淺拷貝案例講解jQuery物件
- 物件拷貝方式物件
- PHP 物件導向 - 物件的淺拷貝與深拷貝PHP物件
- 【JavaScript】物件的淺拷貝與深拷貝JavaScript物件
- JavaScript物件的深拷貝以及淺拷貝分析JavaScript物件
- vue物件的拷貝Vue物件
- JavaScript中物件的拷貝JavaScript物件
- vue的深度拷貝物件Vue物件
- Python - 物件賦值、淺拷貝、深拷貝的區別Python物件賦值
- 三目運算、物件克隆、深拷貝和淺拷貝物件
- js物件實現深淺拷貝!!JS物件
- 操作字元、物件方法, 深淺拷貝字元物件
- 淺拷貝&深拷貝
- js陣列物件複製拷貝不改變原來的值,深拷貝JS陣列物件
- python 指標拷貝,淺拷貝和深拷貝Python指標
- [討論] 人工智慧和大資料會 “殺死” 測試麼?特邀騰訊技術大佬拋磚引玉人工智慧大資料
- 淺拷貝和深拷貝
- 深拷貝和淺拷貝
- 淺拷貝與深拷貝
- javascript對深拷貝物件的研坑JavaScript物件
- 如何對JAVA物件進行深拷貝Java物件
- 談談Objective-C的物件拷貝Object物件
- 深入深入再深入 js 深拷貝物件JS物件
- 安卓/Java物件拷貝(淺/深拷貝、兩種序列化、Beans等工具)安卓Java物件Bean
- 一文搞懂Java引用拷貝、淺拷貝、深拷貝Java
- C++拷貝建構函式(深拷貝,淺拷貝)C++函式
- JS深拷貝與淺拷貝JS
- iOS深拷貝和淺拷貝iOS
- js 深拷貝和淺拷貝JS
- python深拷貝與淺拷貝Python
- JavaScript淺拷貝和深拷貝JavaScript
- Java深拷貝和淺拷貝Java
- Python淺拷貝與深拷貝Python