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
它可能不是儘量精簡你希望,但它是一個有點多類型安全的不需要反思並說明可用於從數據存儲中獲取部分數據的一般方法。