亲宝软件园·资讯

展开

golang超级mapper包 - coven

kingreatwill 人气:0

coven介绍

你可以把它理解成.NET 的 AutoMapper,java的modelmapper

一个快速的转换器去,支持结构到结构,切片到切片和映射到映射非反射转换,类型与嵌套指针支持。
不支持map到struct 和struct到map
速度非常快

  • 结构转换仅影响与源字段同名的目标字段,其余字段将保持不变。支持嵌套的匿名字段。
  • 映射转换仅会影响源映射具有的键的目标映射,其余的将保持不变。
  • 切片转换将覆盖整个目标切片。
  • 支持带有嵌套指针的type。
  • 除map转换外,请使用unsafe.pointer而不是reflect.Value进行转换。

安装

go get -u github.com/petersunbag/coven

用法

type foobar struct {
    D int
}
type Foo struct {
    A []int
    B map[int64][]byte
    C byte
    foobar
}

type Bar struct {
    A []*int
    B map[string]*string
    C *byte
    D int64
}

var c, err = NewConverter(Bar{}, Foo{})
if err != nil {
    panic(err)
}

func demo(){
    foo := Foo{[]int{1, 2, 3}, map[int64][]byte{1: []byte{'a', 'b'}, 2: []byte{'b', 'a'}, 3: []byte{'c', 'd'}}, 6, foobar{11}}
    bar := Bar{}
    err := c.Convert(&bar, &foo)
    if err != nil {
        panic(err)
    }
    bytes, _ := json.Marshal(bar)
    fmt.Println(string(bytes))
}

// Output:
// {"A":[1,2,3],"B":{"1":"ab","2":"ba","3":"cd"},"C":6,"D":11}

性能

总结

该包目前已经生产使用了一年多了,VO转换DTO转换BO PO等都非常方便。
如果觉得每次要使用NewConverter麻烦,可以自己封装下

var (
    mutex sync.Mutex
    c_map  = make(map[string]*coven.Converter)
)

func Map(src, dst interface{}) (err error) {
    key := fmt.Sprintf("%v_%v", reflect.TypeOf(src).String(), reflect.TypeOf(dst).String()) 
    if _, ok := c_map[key]; !ok {       
        mutex.Lock()
        defer mutex.Unlock()
        if c_map[key], err = coven.NewConverter(dst, src); err != nil {
           return
        }
    }
    if err =c_map[key].Convert(dst, src); err != nil {
        return
    }
    return
}

加载全部内容

相关教程
猜你喜欢
用户评论