2014-04-04 22 views
0

datastore.GetMulti(c appengine.Context, key []*Key, dst interface{}) API允許我最多獲得1000個實體。我想獲得更多。如何劃分一個界面{},這是一個切片?

一個明顯的方法來解決這個一般是創建一個包裝函數mypkg.GetMulti()哪些子片(key[0:1000], key[1000:2000]...)原始參數和調用datastore.GetMulti()幾次與他們。

這是很清楚如何分片key []*Key,但我怎麼分片dst interface{}這可能是:

// dst must be a []S, []*S, []I or []P, for some struct type S, some interface 
// type I, or some non-interface non-pointer type P such that P or *P 
// implements PropertyLoadSaver. If an []I, each element must be a valid dst 
// for Get: it must be a struct pointer or implement PropertyLoadSaver. 
// 
// As a special case, PropertyList is an invalid type for dst, even though a 
// PropertyList is a slice of structs. It is treated as invalid to avoid being 
// mistakenly passed when []PropertyList was intended. 

回答

2

既然你是datastore.GetMulti這需要一個interface{}參數調用者,可以提供任何具體的值作爲這個論點;它不需要事先轉換爲空接口類型。換句話說,任何東西和所有東西都實現了空的接口,所以只需傳遞那個東西。

func GetMulti() { 
    mySlice := make([]Whatever, 3000, 3000) 
    for i := 0; i < 3; i++ { 
     subSlice := mySlice[i * 1000 : (i + 1) * 1000] 
     datastore.GetMulti(c,k, subSlice) // 'c' and 'k' assumed to be defined 
    } 
} 

如果mypkg.GetMulti應該是一個通用的功能,服用interface{}價值爲好,那麼你就必須在以下example使用反射的地方,而不是fmt.Println與你所說的子切片的長度datastore.GetMulti每個子切片:

package main 

import "fmt" 
import "reflect" 

func GetMulti(i interface{}) { 
    v := reflect.ValueOf(i) 
    if v.Kind() != reflect.Slice { 
     panic("argument not a slice") 
    } 
    l := v.Len() 
    p := (l/1000) 
    for i := 0; i < p; i++ { 
     fmt.Println(v.Slice(i*1000, (i+1)*1000).Len()) 
    } 
    fmt.Println(v.Slice(p*1000, l).Len()) 

} 

func main() { 
    s := make([]int, 3560, 3560) 
    GetMulti(s) 
} 
+0

感謝您的幫助。如果您能夠回答,我有[後續問題](http://stackoverflow.com/questions/22885336/passing-reflect-value-to-datastore-getmulti-in-google-app-engine)。 – Dan