2016-09-03 12 views
0

動的ページを高速に読み込もうとしています。私は学習課題としてツイッタークローンを作っています。私はアプローチの下以下いセッションにキーを保存してページを高速に読み込む

  1. 誰かのツイートは、メモリキャッシュ内のデータストアにつぶやきと安全それを格納{key.string()、json.Marshal(ツイート)}

  2. Iは、ツイートをプッシュユーザーのホームタイムラインで。ホームタイムラインは[] * datastore.Keyで、これはユーザーセッションに格納されます(memcacheにコピーされ、DBにコピーされます)。

  3. ユーザーが自分のホームページを開いたとき、ホームページはセッションからキーを取得しようとします。見つからなければデータストアクエリを行います。

  4. 私は(デシベルから続いていない場合)memcacheのからのツイートを取得するキーを入手したら

私は正しい情報を取得しています最初のケースでは、ステップ3

で私を立ち往生しています文字列スライス([] * datastore.Keyではなく)にあります。第2のケースで

私はこのエラーを取得

2016年9月3日午後05時23分42秒のhttp:インタフェース 変換:127.0.0.1:47104サービングパニックインターフェース[]は、インターフェース{}、ではありません[]データストア.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

あなたは 'GetGSession'が定義されている方法は? – abhink

+0

これは通常のGorillaセッションです。// GetGSession - func GetGSession(req * http.Request)(セッション*セッションセッション、エラーエラー){ \t session、err = mcdstore.Get(req、 "secondSession") \t申し訳 } –

答えて

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 
    } 

} 
+0

を誤る、 \tリターンセッション{ \tを誤る、 \t \t戻りはnil}!= nilを誤る場合は、私は、あなたの提案を実行するようにでき、これに新しいです。私はv4でnull値を取得します。 –

+0

'type S struct { datastore.Key} func (s S) I() { \t fmt.Println("S implements the I interface") } func f(s S) interface{} { return []interface{}{s} } func GetHTLKeysTypeAssert(req *http.Request, vars ...string) []interface{} { \t ctx := appengine.NewContext(req) \t s, _ := GetGSession(req) \t v := f(S{}) \t key := internalKey \t var ok bool \t if v, ok = s.Values[key]; ok { \t \t v2, ok1 := v.([]interface{}) \t \t if !ok1 {//err} \t \t \t for _, v3 := range v2 { v4, ok2 := v3.(I) \t \t \t if !ok {//err} log.Infof(ctx, "v4 %+v", v4) \t } return v2 }'

+0

ここに私がhttps://play.golangを使用しているコードがあります。org/p/Jo9gp4I9qv –

関連する問題