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



我试图从引用中获取地图,但断言似乎失败了:

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

flashes := session.Flashes("_post")
if flashes != nil {
    flash = flashes[0]
    fmt.Printf("%Tn", 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.(*gin.H).

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

从代码中,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
}
}

最新更新