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

i0n*_*i0n 2 reflection go

我已经看到了一些关于这个主题的反思例子,但我找不到任何解决这个问题的方法。感觉有点复杂,但替代方案是大量重复,所以我想我会试一试。

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

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
    }
}
Run Code Online (Sandbox Code Playgroud)

Jim*_*imB 5

您可以使用反射和类型的示例创建一个切片,如下所示:

var t *MyType

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

s := reflect.MakeSlice(sliceOfT, 0, 0).Interface()
Run Code Online (Sandbox Code Playgroud)

为了在不知道类型的情况下传递一个指向切片的指针,可以先创建指针,然后设置切片值:

ptr := reflect.New(sliceOfT)
ptr.Elem().Set(reflect.MakeSlice(sliceOfT, 0, 0))
s := ptr.Interface()
Run Code Online (Sandbox Code Playgroud)

http://play.golang.org/p/zGSqe45E60