2016-05-20 3 views
1

に落ちる:型アサーションIは、基準外のマップを取得しようとしていますし、アサーションは失敗しているように見える参照/ポインタ

session.AddFlash(gin.H{ 
    "username": username, 
    "password": password, 
}, "_post") 

...

flashes := session.Flashes("_post") 
if flashes != nil { 
    flash = flashes[0] 
    fmt.Printf("%T\n", flash) 
    if post_data, ok := flash.(gin.H); ok { 
     fmt.Println("post_data:", post_data) 
     data = post_data 
    } else { 
     fmt.Println("post_data(failed):", post_data) 
    } 
} 

を私は常に取得しかし、

*gin.H 
post_data(failed): map[] 

は私が試した私がそうやっているアサーションにその原因があるとします:アサートに失敗した次の出力、

if post_data, ok := (*flash).(gin.H); ok { 

しかし、私は、私も試してみましたinvalid indirect of flash (type interface {})

を得る:

if post_data, ok := *flash.(gin.H); ok { 

しかし、それは私に与えタイプのアサーションは、あなたがあることを主張したいタイプを必要とinvalid indirect of flash.(gin.H) (type gin.H)

+2

関連するコード全体を貼り付けることはできますか?どのようにフラッシュを作成し、それは何ですか? –

+2

最初の印刷を 'fmt.Printf("%T \ n "、flash)'に変更します。これは 'flash'の型を出力し、型アサーションで使う正しい型に導きます。より多くのヘルプが必要な場合は、結果を報告してください。 ...または前のコメントで尋ねられたように私たちに関連コードを見せてください。 –

+0

@ T.Claverieコードを追加しました。フラッシュはgin.Hです。 – Gorilla3D

答えて

2

あなたは間違った場所で*を入れています。それはflash.(*gin.H)でなければなりません。

0

アサーション部分とまったく同じ型。

コードのflashinterface{}タイプで、その基になるタイプは*gin.Hfmt.Printf("%T", flash)で印刷)です。したがって、アサーションはここflash.(*gin.H)

あるべきタイプのアサーションを使用するのについてのいくつかの例です:

package main 

import r "reflect" 

type A struct { 
    Name string 
} 

func main() { 
    // No pointer 
    aa := A{"name"} 
    var ii interface{} = aa 

    bb := ii.(A) 
    // main.A 

    // Pointer 
    a := &A{"name"} 
    var i interface{} = a 

    b := *i.(*A) 
    // main.A 

    c := i.(*A) 
    // *main.A 

    d := r.Indirect(r.ValueOf(i)).Interface().(A) 
    // main.A 
} 

} 
関連する問題