落在引用/指针上的类型断言

Type assertion falling on reference / pointer

我正在尝试从参考中获取地图,但断言似乎失败了:

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)

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

根据您的代码,flash 是一种类型 interface{},基础类型是 *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
}

}

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