feat(Go-StudyExample):2021/02/09:新增merge源码阅读和单测代码
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
package mergo_test
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
"testing"
|
||||
|
||||
"github.com/imdario/mergo"
|
||||
)
|
||||
|
||||
type Record struct {
|
||||
Data map[string]interface{}
|
||||
Mapping map[string]string
|
||||
}
|
||||
|
||||
func StructToRecord(in interface{}) *Record {
|
||||
rec := Record{}
|
||||
rec.Data = make(map[string]interface{})
|
||||
rec.Mapping = make(map[string]string)
|
||||
typ := reflect.TypeOf(in)
|
||||
for i := 0; i < typ.NumField(); i++ {
|
||||
field := typ.Field(i)
|
||||
dbFieldName := field.Tag.Get("db")
|
||||
if dbFieldName != "" {
|
||||
rec.Mapping[field.Name] = dbFieldName
|
||||
}
|
||||
}
|
||||
|
||||
if err := mergo.Map(&rec.Data, in); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return &rec
|
||||
}
|
||||
|
||||
func TestStructToRecord(t *testing.T) {
|
||||
type A struct {
|
||||
Name string `json:"name" db:"name"`
|
||||
CIDR string `json:"cidr" db:"cidr"`
|
||||
}
|
||||
type Record struct {
|
||||
Data map[string]interface{}
|
||||
Mapping map[string]string
|
||||
}
|
||||
a := A{Name: "David", CIDR: "10.0.0.0/8"}
|
||||
rec := StructToRecord(a)
|
||||
if len(rec.Mapping) < 2 {
|
||||
t.Fatalf("struct to record failed, no mapping, struct missing tags?, rec: %+v, a: %+v ", rec, a)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user