GoMapper is a library for struct to struct mapping.
There are two use cases: Manual and Auto.
Manual
mode allows you to specify a function to convert one structure to another.Auto
mode uses matching field names for automatic conversion; it is important that not only the field names match, but also their types. This mode also supports structures in structure fields and automatically works by matching field names. It's based on fmap switch case and reflect based library.
Both modes are route based. In which the reflect.Type of the source structure and the type of the destination structure are specified. If such a route was not found, gomapper will return an error.
Also gomapper
support slices, you don't need to specify types of slices for mapping.
go get github.com/insei/gomapper@latest
You can found a lot of examples in tests.
Manual route.
package main
import (
"fmt"
"github.com/insei/gomapper"
)
type Source struct {
Name string
Age uint8
}
type Dest struct {
NameCustom string
Age uint8
}
func main() {
err := gomapper.AddRoute[Source, Dest](func(source Source, dest *Dest) error {
dest.NameCustom = source.Name
dest.Age = source.Age
return nil
})
if err != nil {
panic(err)
}
s := Source{
Name: "DefaultName",
Age: 16,
}
dest, err := gomapper.MapTo[Dest](s)
// or gomapper.MapTo[Dest](&s)
// or d := Dest{}
// gomapper.Map(&s, &d)
if err != nil {
panic(err)
}
fmt.Print(dest)
}
Auto Route.
package main
import (
"fmt"
"github.com/insei/gomapper"
)
type Source struct {
Name string
Age uint8
}
type Dest struct {
NameCustom string
Age uint8
}
func main() {
err := gomapper.AutoRoute[Source, Dest]()
if err != nil {
panic(err)
}
s := Source{
Name: "DefaultName",
Age: 16,
}
dest, err := gomapper.MapTo[Dest](s)
// or gomapper.MapTo[Dest](&s)
// or dest := Dest{}
// gomapper.Map(&s, &dest)
if err != nil {
panic(err)
}
fmt.Print(dest)
}
Map structs into slices.
package main
import (
"fmt"
"github.com/insei/gomapper"
)
type Source struct {
Name string
Age uint8
}
type Dest struct {
NameCustom string
Age uint8
}
func main() {
err := gomapper.AutoRoute[Source, Dest]() // or manual
if err != nil {
panic(err)
}
s := Source{
Name: "DefaultName",
Age: 16,
}
sSlice := []Source{ s }
sDest, err := gomapper.MapTo[[]Dest](sSlice)
// or sDest := []Dest{}
// sDest, err := gomapper.MapTo(sSlice, &sDest)
if err != nil {
panic(err)
}
fmt.Print(sDest)
}