###### 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 %}