golang 每日一庫之 jinzhu-copier
這都 2025 年了,你還在一個一個手動複製字段嗎?
jinzhu/copier 是一個 Go 語言庫,用於深度複製結構體(struct)及其字段,支持嵌套結構體、切片、數組等的複製。這個庫的主要目標是通過簡單的 API 提供高效、易用的對象複製功能,避免手動編寫複製邏輯。
核心特性:
- 深度複製
-
支持深度複製結構體及其嵌套字段,包括切片、數組、映射(map)等。
-
對象的字段會遞歸地被複制到目標對象中。
- 靈活性
-
支持複製不同類型(如基礎類型、結構體、切片、指針等)之間的賦值,能夠靈活地處理大多數常見場景。
-
支持通過標籤 (
struct tag) 來定製字段映射規則,例如可以指定不同字段名的複製規則。
- 自動映射
-
copier會根據字段名進行自動映射,只要源結構體和目標結構體的字段名相同。
-
如果字段名不同,可以通過結構體標籤來指定映射規則。
- 性能
- 由於是基於 Go 的反射機制實現的,所以
copier在性能上相對較好,但在處理非常大的數據量時,可能還是比手動複製稍慢一些。
- 支持指針複製
-
copier支持複製結構體指針,避免了手動解引用的麻煩。
安裝:
可以通過 go get 安裝 jinzhu/copier:
go get github.com/jinzhu/copier
基本用法:
假設我們有一個源結構體和目標結構體,想要將源結構體的值複製到目標結構體:
package main
import (
"fmt"
"github.com/jinzhu/copier"
)
type Person struct {
Name string
Age int
Email string
}
type Employee struct {
Name string
Age int
Email string
}
func main() {
person := Person{
Name: "John Doe",
Age: 30,
Email: "john@example.com",
}
var employee Employee
// 複製 person 到 employee
copier.Copy(&employee, &person)
fmt.Printf("Employee: %+v\n", employee)
}
輸出:
Employee: {Name:John Doe Age:30 Email:john@example.com}
在這個示例中,copier.Copy(&employee, &person) 會自動將 person 中的值複製到 employee 中,前提是兩個結構體字段名一致。
高級用法:
-
字段名不一致的情況
: 如果源結構體和目標結構體字段名不同,可以使用結構體標籤來指定映射關係。
type Person struct {
Name string `copier:"FullName"`
Age int
}
type Employee struct {
FullName string
Age int
}
func main() {
person := Person{
Name: "John Doe",
Age: 30,
}
var employee Employee
// 將 Person 的 Name 字段映射到 Employee 的 FullName 字段
copier.Copy(&employee, &person)
fmt.Printf("Employee: %+v\n", employee)
}
-
嵌套結構體的複製
: 如果結構體中有嵌套的其他結構體,
copier會自動遞歸複製:
type Address struct {
City string
Country string
}
type Person struct {
Name string
Address Address
}
type Employee struct {
Name string
Address Address
}
func main() {
person := Person{
Name: "John Doe",
Address: Address{
City: "New York",
Country: "USA",
},
}
var employee Employee
copier.Copy(&employee, &person)
fmt.Printf("Employee: %+v\n", employee)
}
配置選項:
jinzhu/copier 提供了一些配置選項來控制複製行爲:
-
禁用零值複製
:默認情況下,如果目標結構體的字段爲零值,
copier會跳過複製過程。如果需要強制複製零值,可以通過設置copier.Option來實現。
copier.CopyWithOption(&destination, &source, copier.Option{IgnoreEmpty: false})
-
忽略未導出的字段
:只會複製導出的字段(首字母大寫的字段)。
-
過濾字段
:你可以通過使用過濾器函數來指定哪些字段應該被複制,哪些不應該。
錯誤處理:
雖然 copier 會盡可能做得智能,但是你仍然應該檢查目標結構體的字段和源結構體字段是否完全匹配,特別是在複雜的嵌套結構體的情況下。如果有不兼容的字段類型,copier 會拋出錯誤。
總結:
jinzhu/copier 是一個功能強大且易用的 Go 庫,適用於那些需要批量複製結構體的場景。它不僅支持基本的字段複製,還能處理嵌套結構體、指針等複雜情況,使得對象複製變得簡單高效。
標題:golang 每日一庫之 jinzhu/copier
作者:mooncakeee
地址:http://blog.dd95828.com/articles/2025/01/17/1737094303740.html
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/-pvg_YSEA3EUflZKMY-GyA