繁体   English   中英

Appengine>执行>映射数据存储区结果

[英]Appengine > Go > Mapping datastore results

我正在尝试映射由query.GetAll()获取的结果

我需要映射结果,因为模板将需要与每个实体相关联的数据存储区“ Key”。

目前,我正在执行以下操作:

// 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()来构建地图,因为创建数组,映射并在数组上循环以构建地图似乎并不明智?

还是一种更有效的方式来获取与每个实体相关联的数据存储区密钥(已编码)?

也许最好是将切片压缩为单个切片。 按照这些思路,

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

我认为您不需要地图。 据我了解,在GetAll之后,您有两个并行切片,即key和a。 (我不知道GAE,但是_引起了我的注意。您应该检查一下吗?)模板可以处理并行数组。 在文档中查看range操作如何返回两个结果,即value和and index。 您应该能够跨一个切片,并使用索引从另一个切片中获取相应的值。 这将是一个更复杂的模板,但应该让您避开地图。

编辑:对不起,我以为我知道该怎么做,但是在尝试编写示例时失败了。 如果有人知道如何做,我将其留在这里,否则,请投票...

也许您可以将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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM