copier[1] 是一个轻量级的 Go 语言库,专注于简化结构体之间的数据复制。通过自动或自定义的字段映射,它能够高效处理结构体、切片、甚至嵌套类型的复制,减少手动赋值的冗余代码。由知名 GORM[2] 作者 jinzhu 开发,稳定性和设计理念值得信赖。

1️⃣结构体 ↔ 结构体复制
copier:"目标字段名" 标签映射不同名称的字段。type User struct {
Name string
Age int
}
type Employee struct {
Name string
Age int`copier:"UserAge"`// 显式映射到源结构体的 Age 字段
Salary float64
}
funcmain() {
user := User{Name: "Alice", Age: 30}
employee := Employee{}
copier.Copy(&employee, &user)
// employee.Name = "Alice", employee.UserAge = 30
}
2️⃣切片 ↔ 切片复制
users := []User{{Name: "Alice"}, {Name: "Bob"}}
var employees []Employee
copier.Copy(&employees, &users) // employees 成为包含两个 Employee 的切片
3️⃣自定义转换函数
int ↔ int32、string ↔ []byte)。copier.RegisterConverter 注册函数处理复杂类型转换。copier.CopyWithOption(&dest, &src, copier.Option{
Converters: []copier.TypeConverter{
{
SrcType: time.Time{},
DstType: copier.String,
Fn: func(src interface{}) (interface{}, error) {
return src.(time.Time).Format("2006-01-02"), nil
},
},
},
})
4️⃣忽略字段
copier:"-" 标签跳过指定字段。type Config struct {
APIKey string `copier:"-"` // 复制时忽略此字段
Port int
}
5️⃣深度复制(Deep Copy)
6️⃣复制选项(Option)
IgnoreEmpty:跳过源字段为零值(如 ""、0、nil)的复制。
copier.CopyWithOption(&dest, &src, copier.Option{IgnoreEmpty: true}) // 源字段为空时不覆盖目标
CaseInsensitive:启用不区分大小写的字段匹配(如 Source.Name 匹配 Target.NAME)
DeepCopy:深度复制指针、切片等引用类型(默认浅复制)。
src := &User{Addresses: []Address{{City: "NY"}}}
var dest User
copier.CopyWithOption(&dest, src, copier.Option{DeepCopy: true}) // 复制切片内容而非指针
场景:API 响应过滤敏感字段
type UserModel struct {
ID int
Email string
Password string
}
type UserResponse struct {
ID int`json:"id"`
Email string`json:"email"`
// Password 字段被排除
}
funcGetUser(ctx *gin.Context) {
user := getUserFromDB() // 获取数据库模型
var resp UserResponse
copier.Copy(&resp, &user) // 自动复制 ID 和 Email,跳过 Password
ctx.JSON(200, resp)
}
copier 是处理 Go 结构体复制的神器,尤其适合需要频繁进行数据转换的场景。尽管反射带来轻微性能损耗,但其带来的代码简洁性和可维护性提升,在大多数项目中利大于弊。推荐在 Web 开发、微服务架构或任何涉及多数据模型转换的项目中尝试使用。
[1]copier: https://github.com/jinzhu/copier
[2]GORM: https://github.com/go-gorm/gorm
<<相关阅读>>
每日一库:Excelize——Go语言高效处理Excel的利器
每日一库:Ants —— 高性能低损耗的 Goroutine
每日一库:go-astisub —— 专注于多格式字幕文件的处理