【问题标题】:Create slice of pointers using reflection in Go在 Go 中使用反射创建指针切片
【发布时间】:2015-10-28 01:41:31
【问题描述】:

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

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

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
    }
}

【问题讨论】:

  • 那应该工作正常,也许medder做错了什么?

标签: reflection go


【解决方案1】:

您可以使用 reflect 和如下类型的示例创建切片:

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()

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

【讨论】:

  • @thwd:我知道 ;) 只是显示类型断言,以防 OP 不确定如何从 reflect.MakeSlice 中获取具体类型。
  • 你好。我已经尝试过了,但我想也许我错过了一些东西,因为我得到了以下错误: ScanAll 调用了指向非切片的指针:*interface {} 这是从meddler 发出的。我不喜欢使用 Meddler,只是想要一种快速简单的查询 MySQL 的方法。我很乐意删除它。
  • @i0n:您必须在获取地址之前声明类型,因为您不能使用指向接口的指针。我将添加一个关于使用反射创建指针的示例,如果这就是您要查找的内容。
  • 您好,感谢您的帮助!我认为我需要做的是创建一个指向通过函数接口传入的结构类型的指针切片。产生的切片在自省时需要具有切片等类型,因为我认为这就是导致 meddler 崩溃的原因。这可能吗?
  • @i0n:第一个例子是[]*MyType,第二个例子是*[]*MyType。这些是从 interface{} 出来的实际类型。我认为第二个示例是您正在寻找的,因为您希望立即将指针传递给meddler.QueryAll。
猜你喜欢
  • 1970-01-01
  • 2013-08-09
  • 2021-09-01
  • 2021-01-18
  • 2016-07-17
  • 2015-09-15
  • 2020-05-10
  • 1970-01-01
  • 2021-01-20
相关资源
最近更新 更多