gpt4 book ai didi

google-app-engine - 如何在 Golang 中创建作为参数给定的类型的 slice ?或者如何为 Appengine 数据存储区 getAll 提供一个 []interface{}

转载 作者:IT王子 更新时间:2023-10-29 02:05:29 25 4
gpt4 key购买 nike

我正在尝试创建一个适用于多种实体的处理程序生成器。如果项目 slice 是特定类型(例如:var items []Person),则以下代码有效,但我在概括它时遇到问题:特别是“错误:无法获取项目:数据存储:无效的实体类型”。知道如何声明项以使其具有对 GetAll 有效的类型吗?

func ScaffoldList(entity interface{}, collection string, templ *template.Template) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request){
c := appengine.NewContext(r)
T := reflect.TypeOf(entity)
q := datastore.NewQuery(T.String())
items := reflect.MakeSlice(reflect.SliceOf(T), 0, 10)
_, err := q.GetAll(c, &items)
if err != nil{
c.Errorf("Can't get items: %v", err)
http.Error(w, "Can't get items", http.StatusInternalServerError)
return
}
context.Set(r, collection, items)
ion.RenderTemplate(templ).ServeHTTP(w, r)
})
}

最佳答案

以下是获取 *[]Person 类型参数的方法:

items := reflect.New(reflect.SliceOf(T))
_, err := q.GetAll(c, items.Interface())

GetAll 将为 slice 分配后备数组。无需使用 make 预先分配支持数组。

假设 context.Set 的参数是一个包含 slice 的值,那么您需要取消引用指针:

context.Set(r, collection, items.Elem())

如果上下文不适用于反射值,那么您可能需要:

context.Set(r, collection, items.Elem().Interface())

关于google-app-engine - 如何在 Golang 中创建作为参数给定的类型的 slice ?或者如何为 Appengine 数据存储区 getAll 提供一个 []interface{},我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28757639/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com