Reflection 使用Go中的反射创建指针切片

Reflection 使用Go中的反射创建指针切片,reflection,go,Reflection,Go,我已经看到了一些关于这个话题的反思例子,但是我找不到任何解决这个问题的方法。这感觉有点复杂,但另一种选择是大量的重复,所以我想我应该试试 我有一个返回函数(处理程序)的函数。包装函数传入结构的实例。我需要内部函数来创建指向该结构类型的指针片段: func createCollectionHandler(app *appSession, record interface{}, name string) func(res http.ResponseWriter, req *http.Request)

我已经看到了一些关于这个话题的反思例子,但是我找不到任何解决这个问题的方法。这感觉有点复杂,但另一种选择是大量的重复,所以我想我应该试试

我有一个返回函数(处理程序)的函数。包装函数传入结构的实例。我需要内部函数来创建指向该结构类型的指针片段:

func createCollectionHandler(app *appSession, record interface{}, name string) func(res http.ResponseWriter, req *http.Request) {
    return func(res http.ResponseWriter, req *http.Request) {
        res.Header().Set("Content-Type", "application/json")

        // This line needs to be dynamic:
        var result []*Person

        err := meddler.QueryAll(app.MysqlDB, &result, "select * from "+name)
        if err != nil {
            log.Fatal(err)
        }
        json, err := json.MarshalIndent(result, "", " ")
        if err != nil {
            log.Println(err)
        }
        res.Write([]byte(json))
        return
    }
}

可以使用反射和以下类型的示例创建切片:

var t *MyType

typeOfT := reflect.TypeOf(t)
sliceOfT := reflect.SliceOf(typeOfT)

s := reflect.MakeSlice(sliceOfT, 0, 0).Interface()
为了在不知道类型的情况下传递指向切片的指针,可以先创建指针,然后设置切片值:

ptr := reflect.New(sliceOfT)
ptr.Elem().Set(reflect.MakeSlice(sliceOfT, 0, 0))
s := ptr.Interface()

那应该行得通,也许是多管闲事者做错了什么?@thwd:我知道;)只是显示类型断言,以防OP不确定如何从reflect.MakeSlice.Hey中获取具体类型。我已经试过了,但是我认为可能我遗漏了一些东西,因为我得到了以下错误:ScanAll使用指向非切片的指针调用:*接口{},它是由meddler发出的。我不喜欢使用爱管闲事的人,只想用一种快速简单的方式查询MySQL。我很乐意将其删除。@i0n:在获取地址之前,您必须先声明类型,因为您不能使用指向接口的指针。我将添加一个关于使用reflect创建指针的示例,如果这正是您需要的。嘿,谢谢您的帮助!我认为我需要做的是创建指向通过函数接口传入的结构类型的指针片段。当它被内省时,产生的切片需要有类型切片等,因为我认为这是导致meddler爆炸的原因。这可能吗?@i0n:第一个示例生成一个
[]*MyType
,第二个示例生成一个
*[]*MyType
。这些是将从接口{}中产生的实际类型。我认为第二个例子就是您正在寻找的,因为您希望将指针立即传递到
meddler.QueryAll