4

同じフィールド ID を持つデータストアの種類がいくつかあります。この値を取得できる汎用関数を 1 つ作成することは可能ですか? これに似た何か?

var i interface{}
err = datastore.Get(c, key, &i)
v := reflect.ValueOf(i)
id := v.FieldByName("Id").String()

上記のコードはそのままで、「データストア: エンティティ タイプが無効です」というエラーが表示されます。

4

1 に答える 1

8

var i interface{}具体的なタイプではありません。appengine データストアはリフレクションを使用するため、データを逆シリアル化するための具象型が必要です。ドキュメントから、欠落しているフィールドまたはデータが保存されたものとは異なるタイプのフィールドがあるとエラーが返されるため、ID フィールドだけを定義して構造体を作成できないようです。

それでも、次のように PropertyLoadSaver インターフェースを実装するカスタム型を使用して、何かを解決できる可能性があります。

type IdField struct {
  Id string
}

function (f *IdField) Load(ch <-chan Property) error {
  for p := range ch {
    if p.Name == "Id" {
      f.Id = p.Value.(string)
    }
  }
  return nil
}

function (f *IdField) Save(ch chan<- Property) error {
   return fmt.Errorf("Not implemented")
}

var i = &IdField{}
err := datastore.Get(c, key, i)
id := i.Id

おそらく期待していたほど簡潔ではありませんが、リフレクションを必要とせず、データストアから部分的なデータを取得するために使用できる一般的なアプローチを示しています。

于 2012-09-04T22:45:29.657 に答える