键入断言落在引用/指针上

时间:2016-05-20 16:59:56

标签: dictionary go assertion

我试图从引用中获取一个映射,并且断言似乎失败了:

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 个答案:

答案 0 :(得分:2)

您将*放在错误的位置。它应该是flash.(*gin.H)

答案 1 :(得分:0)

类型断言要求您声明的类型与断言部分的类型完全相同。

从您的代码中,flashinterface{}类型,基础类型是*gin.H(由fmt.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
}

}