golang 每日一庫之 jinzhu-copier

這都 2025 年了,你還在一個一個手動複製字段嗎?

jinzhu/copier 是一個 Go 語言庫,用於深度複製結構體(struct)及其字段,支持嵌套結構體、切片、數組等的複製。這個庫的主要目標是通過簡單的 API 提供高效、易用的對象複製功能,避免手動編寫複製邏輯。

核心特性:

  1. 深度複製
  1. 靈活性
  1. 自動映射
  1. 性能
  1. 支持指針複製

安裝:

可以通過 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 中,前提是兩個結構體字段名一致。

高級用法:

  1. 字段名不一致的情況

    : 如果源結構體和目標結構體字段名不同,可以使用結構體標籤來指定映射關係。

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)
}
  1. 嵌套結構體的複製

    : 如果結構體中有嵌套的其他結構體,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.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