猿问

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

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


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)


MM们
浏览 152回答 2
2回答

鸿蒙传说

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

慕运维8079593

类型断言要求您要断言的类型与断言部分的类型完全相同。从您的代码中,flash是一个类型interface{},而基础类型是*gin.H(由 打印fmt.Printf("%T", flash))。因此断言应该是flash.(*gin.H)下面是一些关于使用类型断言的例子:package mainimport 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}}
随时随地看视频慕课网APP

相关分类

Go
我要回答