我正在尝试映射query.GetAll()
检索到的结果我需要映射结果,因为模板需要与每个实体关联的数据存储“密钥”。
目前我正在做以下事情:
// Query
q := datastore.NewQuery("Article").Limit(10)
// Define array where the entities will be retreived
var a[] Article;
// Retreive entities
key, _ := q.GetAll(c, &a)
// Create an empty map
article := map[string] Article{}
// Build the map
for k := range a {
article[key[k].Encode()] = a[k];
}
template.Execute(w, map[string]interface{} { "Articles" : article})
是否有更有效的方法直接使用query.GetAll()构建地图,因为创建数组,数组上的地图和循环以构建地图似乎不明智?
或者更有效的方法来获取与每个实体关联的数据存储区密钥(编码)?
答案 0 :(得分:1)
也许最好是将切片压缩成单个切片。沿着这些路线,
package main
import (
"os"
"text/template"
)
type pair struct {
Key string
Article string
}
var tmpt = `Here's the list:{{range $p := .}}
{{$p.Key}}: {{$p.Article}}{{end}}
`
func main() {
list := template.Must(template.New("list").Parse(tmpt))
// query
key := []string{"banana", "donkey", "curious"}
a := []string{"long fruit", "who needs one?", "human nature"}
// zip
pairs := make([]pair, len(key))
for i, k := range key {
pairs[i].Key = k
pairs[i].Article = a[i]
}
// execute on zipped list
if err := list.Execute(os.Stdout, pairs); err != nil {
os.Stdout.WriteString(err.Error())
}
}
输出:
Here's the list: banana: long fruit donkey: who needs one? curious: human nature
答案 1 :(得分:0)
我认为你不需要地图。如果我理解,在GetAll之后,你有两个平行切片,key和a。 (我不知道GAE,但_引起了我的注意。你应该检查一下吗?)模板可以处理并行数组。请参阅doc文档中的范围操作如何返回两个结果,一个值和索引。您应该能够覆盖一个切片并使用索引从另一个切片获取相应的值。它将是一个更复杂的模板,但应该让你避免使用地图。
编辑:对不起,我以为我知道怎么做,但是在我尝试编写示例代码时失败了。我会把它留在这里以防其他人知道如何做到这一点,否则,downvote ......
答案 2 :(得分:0)
也许您可以在Key
中嵌入Article
。你仍然需要遍历文章和键,但至少你不必创建一个单独的地图。
type Article struct {
// Add a key to the struct, but prevent it from being saved to the datastore.
Key datastore.Key `datastore:"-"`
}
// Query
q := datastore.NewQuery("Article").Limit(10)
// Define array where the entities will be retreived
var a[] Article
// Retreive entities
key, _ := q.GetAll(c, &a)
// Loop through the articles adding the key as you go.
for i := range a {
a[i].Key = key[i]
}
template.Execute(w, map[string]interface{} { "Articles" : a})
然后在您的模板中,您可以拨打article.Key.Encode