在一些业务场景下,两个不同的结构需要赋值,他们大部分字段是相同的,只有少部分不同,而字段又很多,有几十个,通过 手工的赋值就会觉得代码量很多,而且也不算是很有意义的工作。因此,这个场景下可以使用copier库来复制一些相同的字段 减少手工复制的处理。

下面是一些小场景下使用copier库,以防踩坑

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
type Copier1 struct {
	Name  string
	Age   int32
	Hobby string
}
type Copier2 struct {
	Name string
	Age  int32
}
type Copier3 struct {
	Hobby string
}
v1 := &Copier1{Name: "zs", Age: 20}
v2 := &Copier2{Name: "ls", Age: 30}
copier.Copy(v1, v2)
fmt.Printf("%#v\n", v1)

// 会将v3置为默认值
v3 := &Copier1{Name: "zs", Age: 20}
v4 := &Copier2{}
copier.Copy(v3, v4)
fmt.Printf("%#v\n", v3)

// 将一个nil值的内容复制到v5,并不会将v5置为nil
v5 := &Copier1{Name: "zs", Age: 20}
var v6 *Copier2
copier.Copy(v5, v6)
fmt.Printf("%#v\n", v5)

// 将多个值copy到同一个结构体中
v7 := &Copier3{Hobby: "swim"}
v6 = &Copier2{Name: "we", Age: 50}
copier.Copy(v5, v6)
copier.Copy(v5, v7)
fmt.Printf("%#v\n", v5)

output:

1
2
3
4
5
6
7
8
# 直接复制,新值替换旧值
&main.Copier1{Name:"ls", Age:30, Hobby:""}
# 空值复制,新值替换旧值
&main.Copier1{Name:"", Age:0, Hobby:""}
# nil复制,旧值保持不变
&main.Copier1{Name:"zs", Age:20, Hobby:""}
# 多个新值复制,新值先后影响到相关字段
&main.Copier1{Name:"we", Age:50, Hobby:"swim"}