通过将密钥存储到会话golang中来加载页面更快

时间:2016-09-03 18:29:01

标签: google-app-engine session twitter go

我正在尝试更快地加载动态页面。我正在将twitter克隆作为一项学习任务。我遵循以下方法

  1. 当有人发推文时,将推文存储在数据存储中,并在memcache {key.string(),json.Marshal(tweet)}

  2. 中保密
  3. 我在用户主页时间线推送推文。本地时间行是[] * datastore.Key,存储在用户会话中(在memcache中复制,然后在DB中复制)。

  4. 当用户打开她的主页时,主页会尝试从会话中获取密钥,如果没有找到,则会进行数据存储查询。

  5. 一旦我拿到了密钥,我就会从memcache中获取推文(如果没有,则从db获取)

  6. 我被困在第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
    }
    

1 个答案:

答案 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 
    }

}