登录
首页 >  Golang >  Go问答

Go 中是否支持动态组织结构?

来源:stackoverflow

时间:2024-02-29 17:03:24 445浏览 收藏

亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《Go 中是否支持动态组织结构?》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下,希望所有认真读完的童鞋们,都有实质性的提高。

问题内容

我有一些冗余逻辑正在提取到实用程序中以将请求绑定到结构,我希望我可以以某种方式动态地执行此操作。我想要的基本上是将任何请求绑定到我传入的结构类型。这将大大减少我的程序中的一些代码。

我可以有一个 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)


}

解决方案


当您编组或解码这样的未知结构时,您无需执行任何其他操作:只需将接口值传递给编码器,它将使用反射对底层值进行编码,或者调用 mashaljson(如果是)实现自定义封送拆收器。

dynamicstruct.ctype=somestructvalue

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

dynamicStruct.cType=&SomeStruct{}

那么您不需要创建未知类型的新实例,只需将接口传递给 unmarshal 即可。

本篇关于《Go 中是否支持动态组织结构?》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>