MapStruct 是一个在 Go 中实现对象映射的库,它可以帮助你轻松地在不同的结构体之间转换数据。以下是使用 MapStruct 的基本方法:
首先,你需要安装 MapStruct:
bash
复制
下载
go get github.com/gorilla/mapstruct
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} }
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} }
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} }
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} }
MapStruct 是运行时反射实现的,性能不如代码生成方案
对于复杂映射场景,可以考虑使用更专业的库如 github.com/mitchellh/mapstructure
在性能敏感场景,可以考虑代码生成方案如 github.com/jinzhu/copier
希望这些示例能帮助你开始使用 Go 中的 MapStruct!