如何在Go中实例化未知类型的值?

如何在Go中实例化未知类型的值?,go,reflection,Go,Reflection,我在golang开发了一些服务器。我尝试创建一些包装器函数,它可以在将来帮助我 我所拥有的: 1) 我有一些DTO结构,例如: type Request struct { Field1 string `json:"field1"` Field2 string `json:"field2"` } type Response struct { Field1 string `json:"field1"` Field2 string `json:"fie

我在golang开发了一些服务器。我尝试创建一些包装器函数,它可以在将来帮助我

我所拥有的:

1) 我有一些DTO结构,例如:

type Request struct {
    Field1   string `json:"field1"`
    Field2   string `json:"field2"`
}

type Response struct {
    Field1   string `json:"field1"`
    Field2   string `json:"field2"`
    Field3   string `json:"field3"`
}
func SomeHandler(request *Request) *Response{
    ...do something
    return &Response{"first","second","third"}
}
2) 在控制器层,我有一些函数(按照约定)接收1个参数(指向结构的指针)并返回1个结果(指向结构的指针),例如:

type Request struct {
    Field1   string `json:"field1"`
    Field2   string `json:"field2"`
}

type Response struct {
    Field1   string `json:"field1"`
    Field2   string `json:"field2"`
    Field3   string `json:"field3"`
}
func SomeHandler(request *Request) *Response{
    ...do something
    return &Response{"first","second","third"}
}
我需要的是:

我需要编写作为参数接收的包装器函数:

  • 指向“控制器”函数的指针
  • http.ResponseWriter
  • *请求
  • 此包装函数必须:

  • 确定“控制器”函数的参数类型
  • 确定“控制器”功能的结果类型
  • 从*http.Request的主体实例化并填充参数值(从json解码)
  • 在上一步参数上实例化的调用控制器函数
  • 将上一步的结果写入http.ResponseWriter(编码为json)
  • 包装器必须能正确处理任何类型的“控制器”函数-此函数的签名不同(不同的参数类型,不同的结果类型)


    有谁能帮我实现这个包装器吗?

    你所做的有点奇怪,但可以提供你需要的所有信息

    func myFunction(a string, b int32) error {
        return nil
    }
    
    func myWrapper(mystery interface{}) {
        typ := reflect.TypeOf(mystery)
    
        // Check typ.Kind before playing with In(i);
        for i := 0; i < typ.NumIn(); i++ {
            fmt.Printf("Param %d: %v\n", i, typ.In(i))
        }
        for i := 0; i < typ.NumOut(); i++ {
            fmt.Printf("Result %d: %v\n", i, typ.Out(i))
        }
    
    }
    

    你所做的有点奇怪,但可以提供你需要的所有信息

    func myFunction(a string, b int32) error {
        return nil
    }
    
    func myWrapper(mystery interface{}) {
        typ := reflect.TypeOf(mystery)
    
        // Check typ.Kind before playing with In(i);
        for i := 0; i < typ.NumIn(); i++ {
            fmt.Printf("Param %d: %v\n", i, typ.In(i))
        }
        for i := 0; i < typ.NumOut(); i++ {
            fmt.Printf("Result %d: %v\n", i, typ.Out(i))
        }
    
    }
    

    类似的方法应该可以工作(未经测试):


    请注意,第二步是不必要的。

    类似的方法应该可以工作(未经测试):


    请注意,第二步是不必要的。

    谢谢您的回答。你写道我做的事情有点像有线电视,也许你是对的,我是golang的新手。那个么解决这个问题的方法是什么呢?我不想多次编写类似的代码,但在许多“控制器”函数中,我需要做同样的事情:将json的输入解码到我的模型(结构),将对象中的数据编码到json,然后将其写入输出,但我不明白如何以go-way的方式进行,你能帮我吗?@YuriiVasilchuk我不明白你的确切用例。我认为您可以改变方法,使用单个函数进行编码和解码(go的Marshal/Unmarshal非常通用:它们接受接口{},因此您可以传递任何内容)。这个函数需要知道的只是源/目标类型,我认为您可以从处理程序中“知道”这一点。谢谢您的回答。你写道我做的事情有点像有线电视,也许你是对的,我是golang的新手。那个么解决这个问题的方法是什么呢?我不想多次编写类似的代码,但在许多“控制器”函数中,我需要做同样的事情:将json的输入解码到我的模型(结构),将对象中的数据编码到json,然后将其写入输出,但我不明白如何以go-way的方式进行,你能帮我吗?@YuriiVasilchuk我不明白你的确切用例。我认为您可以改变方法,使用单个函数进行编码和解码(go的Marshal/Unmarshal非常通用:它们接受接口{},因此您可以传递任何内容)。这个函数只需要知道源/目标类型,我想您可以从处理程序中“知道”这一点。