go mapstruct如何使用

使用 Go MapStruct

MapStruct 是一个在 Go 中实现对象映射的库,它可以帮助你轻松地在不同的结构体之间转换数据。以下是使用 MapStruct 的基本方法:

安装

首先,你需要安装 MapStruct:

bash

复制

下载

go get github.com/gorilla/mapstruct

基本用法

1. 简单映射

go

复制

下载

package main

import (
	"fmt"
	"github.com/gorilla/mapstruct"
)

type User struct {
	Name string
	Age  int
}

type UserDTO struct {
	Name string
	Age  int
}

func main() {
	user := User{Name: "Alice", Age: 30}
	var userDTO UserDTO
	
	err := mapstruct.Decode(user, &userDTO)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
	
	fmt.Printf("%+v\n", userDTO) // 输出: {Name:Alice Age:30}
}

2. 字段名称不同时的映射

go

复制

下载

type User struct {
	Username string
	Years    int
}

type UserDTO struct {
	Name string `mapstruct:"Username"`
	Age  int    `mapstruct:"Years"`
}

func main() {
	user := User{Username: "Bob", Years: 25}
	var userDTO UserDTO
	
	err := mapstruct.Decode(user, &userDTO)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
	
	fmt.Printf("%+v\n", userDTO) // 输出: {Name:Bob Age:25}
}

3. 嵌套结构映射

go

复制

下载

type Address struct {
	City  string
	State string
}

type Person struct {
	Name    string
	Address Address
}

type PersonDTO struct {
	Name    string
	City    string `mapstruct:"Address.City"`
	State   string `mapstruct:"Address.State"`
}

func main() {
	person := Person{
		Name: "Charlie",
		Address: Address{
			City:  "New York",
			State: "NY",
		},
	}
	
	var personDTO PersonDTO
	
	err := mapstruct.Decode(person, &personDTO)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
	
	fmt.Printf("%+v\n", personDTO) // 输出: {Name:Charlie City:New York State:NY}
}

4. 反向映射

go

复制

下载

func main() {
	userDTO := UserDTO{Name: "David", Age: 40}
	var user User
	
	err := mapstruct.Decode(userDTO, &user)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
	
	fmt.Printf("%+v\n", user) // 输出: {Username:David Years:40}
}

高级用法

自定义转换函数

go

复制

下载

type Source struct {
	Temperature float64
}

type Dest struct {
	Weather string
}

func convertTemp(temp float64) string {
	if temp > 30 {
		return "Hot"
	}
	return "Cold"
}

func main() {
	src := Source{Temperature: 35.5}
	var dest Dest
	
	config := &mapstruct.DecoderConfig{
		DecodeHook: mapstruct.ComposeDecodeHookFunc(
			func(f reflect.Type, t reflect.Type, data interface{}) (interface{}, error) {
				if f.Kind() == reflect.Float64 && t.Kind() == reflect.String {
					return convertTemp(data.(float64)), nil
				}
				return data, nil
			},
		),
		Result: &dest,
	}
	
	decoder, err := mapstruct.NewDecoder(config)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
	
	err = decoder.Decode(src)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
	
	fmt.Printf("%+v\n", dest) // 输出: {Weather:Hot}
}

忽略字段

go

复制

下载

type Source struct {
	Name string
	Age  int
}

type Dest struct {
	Name string
	// Age 字段将被忽略
}

func main() {
	src := Source{Name: "Eve", Age: 28}
	var dest Dest
	
	err := mapstruct.Decode(src, &dest)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
	
	fmt.Printf("%+v\n", dest) // 输出: {Name:Eve}
}

注意事项

  1. MapStruct 是运行时反射实现的,性能不如代码生成方案

  2. 对于复杂映射场景,可以考虑使用更专业的库如 github.com/mitchellh/mapstructure

  3. 在性能敏感场景,可以考虑代码生成方案如 github.com/jinzhu/copier

希望这些示例能帮助你开始使用 Go 中的 MapStruct!

你可能感兴趣的:(go mapstruct如何使用)