为了账号安全,请及时绑定邮箱和手机立即绑定

可以在 Go 中对结构进行动态编组吗?

可以在 Go 中对结构进行动态编组吗?

Go
牛魔王的故事 2022-05-18 10:40:16
我有一些冗余逻辑要提取到一个实用程序中以将请求绑定到结构,我希望我能以某种方式动态地做到这一点。我想要的是基本上一般地将任何请求绑定到我传入的结构类型。这将大大减少我程序中的一些代码。我可以有一个Task结构,或者我可以有一个Information结构。所有这些信息都通过 JSON 进入服务器,但我希望能够传入类型名称并让它自动绑定以减少我正在编写的代码。示例调用者func StoreTask(dbWrapper *database.DB) func(http.ResponseWriter, *http.Request) {    return func(rw http.ResponseWriter, r *http.Request) {        data := &utilities.DynamicStruct{entities.Task, r, rw}        utilities.PersistRequest(data)    }}这是我的小例子:type DynamicStruct struct {    cType  interface{}    writer http.ResponseWriter    req    *http.Request}func PersistRequest(s *DynamicStruct, decoderOpts *DecoderMetadata) {    r := s.req    rw := s.writer    // I want the struct to basically be able to take any type     data := s.cType    err := r.ParseForm()    if err != nil {        log.Printf("HTTP %d - %s", 500, err.Error())        http.Error(rw, err.Error(), 500)    }    // This is where the dynamic nature of the param would come into play that I'm looking for..    newTask := new(data)    decoder := utilities.GenerateDecoder(decoderOpts)    // Using gorilla/schema here    err = decoder.Decode(newTask, r.Form)    if err != nil {        log.Printf("HTTP %d - %s", 500, err.Error())        http.Error(rw, err.Error(), 500)    }    rw.Header().Set("Content-Type", "application/json")    json.NewEncoder(rw).Encode(newTask)}
查看完整描述

1 回答

?
30秒到达战场

TA贡献1828条经验 获得超6个赞

当你像这样编组或解码未知结构时,你不需要做任何额外的事情:只需将接口值传递给编码器,它就会使用反射对底层值进行编码,或者MashalJSON如果它实现了自定义编组器,则调用.

dynamicStruct.cType=someStructValue

如果要解组,则可以通过将指针传递给结构来执行相同的操作:

dynamicStruct.cType=&SomeStruct{}

然后你不需要创建一个未知类型的新实例,只需将接口传递给 unmarshal。


查看完整回答
反对 回复 2022-05-18
  • 1 回答
  • 0 关注
  • 147 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号