我正在尝试更快地加载动态页面。我正在将twitter克隆作为一项学习任务。我遵循以下方法
当有人发推文时,将推文存储在数据存储中,并在memcache {key.string(),json.Marshal(tweet)}
我在用户主页时间线推送推文。本地时间行是[] * datastore.Key,存储在用户会话中(在memcache中复制,然后在DB中复制)。
当用户打开她的主页时,主页会尝试从会话中获取密钥,如果没有找到,则会进行数据存储查询。
一旦我拿到了密钥,我就会从memcache中获取推文(如果没有,则从db获取)
我被困在第3步。
在第一种情况下,我得到了正确的信息,但是在字符串切片中(不在[] * datastore.Key中)。
在第二种情况下,我收到此错误
2016/09/03 17:23:42 http:恐慌服务127.0.0.1:47104:界面 转换:interface是[] interface {},而不是[] datastore.Key
请帮助我,在我出错的地方,有更好的方法。
案例1
func GetKeys(req *http.Request, vars ...string) []interface{} {
//GetKeys - get the keys
s, _ := GetGSession(req)
var flashes []interface{}
key := internalKey
if len(vars) > 0 {
key = vars[0]
}
if v, ok := s.Values[key]; ok {
// Drop the flashes and return it.
// delete(s.Values, key)
flashes = v.([]interface{})
}
return flashes
}
情况2
//GetHTLKeys - get the hometimeline keys
func GetHTLKeys(req *http.Request, vars ...string) []datastore.Key {
s, _ := GetGSession(req)
var keyList []datastore.Key
key := internalKey
if len(vars) > 0 {
key = vars[0]
}
if v, ok := s.Values[key]; ok {
keyList = v.([]datastore.Key)
}
return keyList
}
答案 0 :(得分:0)
您的问题是,您无法声明[]interface{}
是[]datastore.Key
。这是因为它们不同。
此时你可以做的是将v
类型断言为[]interface{}
然后遍历切片并键入断言每个元素。
以下示例说明了这一点(playground version):
type I interface {
I()
}
type S struct{}
func (s S) I() {
fmt.Println("S implements the I interface")
}
// Represents you getting something out of the session
func f(s S) interface{} {
return []interface{}{s}
}
func main() {
v := f(S{})
//v2 := v.([]I) would panic like in your example.
v2, ok := v.([]interface{})
if !ok {
// handle having a non []interface{} as a value
}
for _, v3 := range v2 {
v4, ok := v3.(I)
if !ok {
// handle having a non-I in the slice
}
v4.I() //you definitely have an I here
}
}