同じフィールド ID を持つデータストアの種類がいくつかあります。この値を取得できる汎用関数を 1 つ作成することは可能ですか? これに似た何か?
var i interface{}
err = datastore.Get(c, key, &i)
v := reflect.ValueOf(i)
id := v.FieldByName("Id").String()
上記のコードはそのままで、「データストア: エンティティ タイプが無効です」というエラーが表示されます。
同じフィールド ID を持つデータストアの種類がいくつかあります。この値を取得できる汎用関数を 1 つ作成することは可能ですか? これに似た何か?
var i interface{}
err = datastore.Get(c, key, &i)
v := reflect.ValueOf(i)
id := v.FieldByName("Id").String()
上記のコードはそのままで、「データストア: エンティティ タイプが無効です」というエラーが表示されます。
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
おそらく期待していたほど簡潔ではありませんが、リフレクションを必要とせず、データストアから部分的なデータを取得するために使用できる一般的なアプローチを示しています。