###### tags: `Golang Package` # Diff [github](https://github.com/r3labs/diff) 比較兩個相同類型的結構,並回傳所有修改處。 ## Usecase 1 ```go= from := &Item{ ID: "1293120938", Price: 2000, Look: 22, Status: true, } to := &Item{ ID: "1293120938", Price: 1500, Look: 30, Status: true, } changelog, _ := diff.Diff(from, to) ``` 結果中列出 Price 2000 -> 1500 Look 22 -> 30 ```= (diff.Changelog) (len=2 cap=2) { (diff.Change) { Type: (string) (len=6) "update", Path: ([]string) (len=1 cap=1) { (string) (len=5) "Price" }, From: (int64) 2000, To: (int64) 1500 }, (diff.Change) { Type: (string) (len=6) "update", Path: ([]string) (len=1 cap=1) { (string) (len=4) "Look" }, From: (int64) 22, To: (int64) 30 } } ``` ## Usecase 2 子結構 ```go= from := &Item{ ID: "1293120938", Price: 2000, Look: 22, Status: true, Buyer: &Member{ Name: "Mask", Age: 20, }, } to := &Item{ ID: "1293120938", Price: 2000, Look: 22, Status: true, Buyer: &Member{ Name: "Krotos", Age: 20, }, } changelog, _ := diff.Diff(from, to) ``` 返回的結構中指出Buyer、Name ```= (diff.Changelog) (len=1 cap=1) { (diff.Change) { Type: (string) (len=6) "update", Path: ([]string) (len=2 cap=2) { (string) (len=5) "Buyer", (string) (len=4) "Name" }, From: (string) (len=4) "Mask", To: (string) (len=6) "Krotos" } } ``` ## Usecase 3 將變更的內容更改回from ```go= from := &Item{ ID: "1293120938", Price: 2000, Look: 22, Status: true, Buyer: &Member{ Name: "Mask", Age: 20, }, Tag: []int{}, CreateAt: time.Now(), } to := &Item{ ID: "1293120938", Price: 2000, Look: 33, Status: true, Buyer: &Member{ Name: "krotos", Age: 30, }, Tag: []int{1, 2, 3, 4, 5, 8}, } changelog, _ := diff.Diff(from, to, diff.AllowTypeMismatch(true)) diff.Patch(changelog, &from) spew.Dump(from) ``` ``` (*main.Item)(0xc0000b0240)({ ID: (string) (len=10) "1293120938", Price: (int64) 2000, Look: (int64) 33, Status: (bool) true, Buyer: (*main.Member)(0xc0000aa160)({ Name: (string) (len=6) "krotos", Age: (int) 30 }), Tag: ([]int) (len=6 cap=8) { (int) 1, (int) 2, (int) 3, (int) 4, (int) 5, (int) 8 }, CreateAt: (time.Time) 2021-12-16 16:21:25.311424 +0800 CST m=+0.000324751 }) ``` # 結論 原先是想說可以運用在Update上,但是沒傳得值會被當作要更新成空的,運用上限制比較多,可能沒有那麼好用,但如果能用上,可以省去一個欄位一個欄位更改的工。 {%hackmd theme-dark %}