2

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() を使用して直接マップを作成するより効率的な方法はありますか?

または、各エンティティに関連付けられたデータストア キー (エンコード済み) を取得するより効率的な方法はありますか?

4

3 に答える 3

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

出力:

リストは次のとおりです。
        バナナ:長い実
        ロバ:誰が必要ですか?
        好奇心:人間の本性
于 2012-04-30T22:01:44.577 に答える
0

地図はいらないと思います。GetAll の後、key と a という 2 つの並列スライスがあることがわかりました。(GAE はわかりませんが、_ は眉をひそめます。確認する必要がありますか?) テンプレートは、並列配列を処理できます。範囲アクションが値とインデックスの 2 つの結果を返す方法をドキュメントで参照してください。1 つのスライスにまたがり、インデックスを使用して他のスライスから対応する値を取得できる必要があります。より複雑なテンプレートになりますが、マップを回避できるはずです。

編集:申し訳ありませんが、これを行う方法を知っていると思っていましたが、例をコーディングしようとすると失敗しました。他の誰かがこれを行う方法を知っている場合に備えて、ここに残します。そうでない場合は、反対票を投じてください...

于 2012-04-30T14:09:21.847 に答える
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

于 2012-05-07T06:27:36.743 に答える