2012-09-04 40 views
3

我有幾個數據存儲區種類具有相同的字段ID。是否有可能創建一個可以讓我獲得這個值的泛型函數?類似這樣的東西?獲取數據存儲實體到Go中的接口中

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

上面的代碼就這樣給了我一個「datastore:invalid entity type」錯誤。

回答

7

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 

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

相關問題