本文主要是介绍Golang利用reflect包实现struct相互填充,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
最近在用Golang写一些简单的业务,经常需要在两类相似的结构体之间相互填充数据,如果struct只有少数几个field,相互赋值还好;但如果struct有很多field的话,简直吐血,代码也不雅观,对于懒癌晚期简直不能容忍,看了下Golang的reflect包,好像找到一种偷懒的办法。。。
type Request struct {Field1 stringField2 stringField3 string
}type ORM struct {OtherField stringField1 stringField2 stringField3 string
}// src和dst必须是struct,且dst必须是point
func Fill(src interface{}, dst interface{}) error {srcType := reflect.TypeOf(src)srcValue := reflect.ValueOf(src)dstValue := reflect.ValueOf(dst)if srcType.Kind() != reflect.Struct {return errors.New("src必须是struct")}if dstValue.Kind() != reflect.Ptr {return errors.New("dst必须是point")}for i := 0; i < srcType.NumField(); i++ {dstField := dstValue.Elem().FieldByName(srcType.Field(i).Name)if dstField.CanSet() {dstField.Set(srcValue.Field(i))}}return nil
}func main() {request := Request{Field1: "1",Field2: "2",Field3: "3",}orm := ORM{}req := Request{}if err := Fill(request, &orm); err != nil {log.Fatal(err)}log.Printf("%#v", orm)if err := Fill(orm, &req); err != nil {log.Fatal(err)}log.Printf("%#v", req)
}
这篇关于Golang利用reflect包实现struct相互填充的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!