文章

结构体解析库

copier库

github.com/jinzhu/copier 进行结构体之间数据拷贝

相关的包:

1
2
3
import (
	"github.com/jinzhu/copier"
)

语法

1
copier.Copy(&目标, &)

基础使用

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package main

import (
	"fmt"
	"github.com/jinzhu/copier"
)

// 复制源
type Src struct {
	Name        string
	Role        string
	Age         int32
	EmployeCode int64 `copier:"EmployeNum"` // 指定字段名称
	Salary      int   // 在目标结构中显式忽略
	SpecialSrc  int   //私有属性, 无法复制
}

// 目标
type Dst struct {
	Name       string `copier:"must"`         // 必须复制,字段未复制则panic
	Age        int32  `copier:"must,nopanic"` // 必须复制,字段未复制则返回一个error
	Salary     int    `copier:"-"`            // 忽略复制此字段
	EmployeId  int64  `copier:"EmployeNum"`   // 指定字段名称
	DoubleAge  int32
	SuperRole  string
	SpecialDst int
}

func main() {
	var (
		src  = Src{Name: "Jinzhu", Age: 18, Role: "Admin", Salary: 200000, SpecialSrc: 6666}
		srcs = []Src{
			{Name: "Jinzhu", Age: 18, Role: "Admin", Salary: 100000},
			{Name: "jinzhu 2", Age: 30, Role: "Dev", Salary: 60000}}
		dst  = Dst{Salary: 150000, SpecialDst: 9999}
		dsts = []Dst{}
	)
	//复制 结构体->结构体
	copier.Copy(&dst, &src)
	// {Name:Jinzhu Age:18 Salary:150000 EmployeId:0 DoubleAge:0 SuperRole: SpecialDst:9999} 
	fmt.Printf("%+v \n", dst)

	//复制 结构体->结构体数组
	copier.Copy(&dsts, &src)
	// [{Name:Jinzhu Age:18 Salary:0 EmployeId:0 DoubleAge:0 SuperRole: SpecialDst:0}] 
	fmt.Printf("%+v \n", dsts)

	//复制 结构体数组->结构体数组
	employees := []Dst{}
	copier.Copy(&employees, &srcs)
    // [{Name:Jinzhu Age:18 Salary:0 EmployeId:0 DoubleAge:0 SuperRole: SpecialDst:0} {Name:jinzhu 2 Age:30 Salary:0 EmployeId:0 DoubleAge:0 SuperRole: SpecialDst:0}] 
	fmt.Printf("%+v \n", employees)
}

© 2024- lfj