Skip to content
鼓励作者:欢迎打赏犒劳

go对象拷贝

go
package main

import (
	"fmt"

	"github.com/jinzhu/copier"
)

type User struct {
	Name string
	Age  int
	Tags []string
}

type UserDTO struct {
	Name string
	Age  int32 // 自动类型转换
	Tags []string
	// 如果有额外字段,不会报错,自动忽略
	Extra string
}

func main() {
	// 示例1:单个对象拷贝
	user := User{
		Name: "Alice",
		Age:  30,
		Tags: []string{"go", "dev"},
	}

	var dto UserDTO
	err := copier.Copy(&dto, &user) // 也可以传 user,不要求是指针
	if err != nil {
		fmt.Println("Copy failed:", err)
		return
	}

	fmt.Printf("User -> DTO: %+v\n", dto)
	// 输出: User -> DTO: {Name:Alice Age:30 Tags:[go dev] Extra:}

	// 示例2:Slice 拷贝(自动遍历并转换)
	users := []User{
		{Name: "Bob", Age: 25, Tags: []string{"frontend"}},
		{Name: "Charlie", Age: 35, Tags: []string{"backend", "rust"}},
	}

	var dtos []UserDTO
	err = copier.Copy(&dtos, &users)
	if err != nil {
		fmt.Println("Copy slice failed:", err)
		return
	}

	fmt.Printf("Users -> DTOS: %+v\n", dtos)
	// 输出: Users -> DTOS: [{Name:Bob Age:25 Tags:[frontend] Extra:} {Name:Charlie Age:35 Tags:[backend rust] Extra:}]

}

结果

text
User -> DTO: {Name:Alice Age:30 Tags:[go dev] Extra:}
Users -> DTOS: [{Name:Bob Age:25 Tags:[frontend] Extra:} {Name:Charlie Age:35 Tags:[backend rust] Extra:}]

如有转载或 CV 的请标注本站原文地址