为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
MM们 2022-01-10 17:40:07
我正在尝试从参考中获取地图,并且断言似乎失败了: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.Hpost_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 回答

?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

你放*错地方了。应该是flash.(*gin.H)


查看完整回答
反对 回复 2022-01-10
?
慕运维8079593

TA贡献1876条经验 获得超5个赞

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


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

}


}



查看完整回答
反对 回复 2022-01-10
  • 2 回答
  • 0 关注
  • 151 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信