检测GO中是否存在自定义结构

zdwk9cvp  于 2023-01-15  发布在  Go
关注(0)|答案(1)|浏览(156)

有没有办法检查变量中是否存在自定义结构体?不幸的是,在nil检查时,我得到消息"mismatched types models.Memberz and untyped nil"
我现在已经把它改成了一个额外的变量,并改变了那里的类型,这似乎起作用了。
这段代码使用了一个额外的变量,工作正常,但发现有点麻烦。

func Session(c *gin.Context) {
    session := sessions.Default(c)

    v := session.Get("secure")

    if v == nil {

        var data = models.Memberz{
            Name:     "test",
            Age:      0,
            Loggedin: true,
        }

        session.Set("secure", data)
        session.Save()
    } else {

        member := v.(models.Memberz)
        fmt.Println("data: " + member.Name)
    }
    c.JSON(200, gin.H{
        "status": "success",
    })
}

实际上我希望下面的代码可以工作,但是它给出了一个错误。在Golang中有没有其他的选项可以让我检查这个?

func Session(c *gin.Context) {
    session := sessions.Default(c)

    v := session.Get("secure").(models.Memberz)

    if v == nil {

        var data = models.Memberz{
            Name:     "test",
            Age:      0,
            Loggedin: true,
        }

        session.Set("secure", data)
        session.Save()
    } else {

        fmt.Println("data: " + v.Name)
    }

    c.JSON(200, gin.H{
        "status": "success",
    })

}
5tmbdcev

5tmbdcev1#

使用可用于类型Assert的 special“coma ok”赋值形式。

v, ok := session.Get("secure").(models.Memberz)
if !ok {
    // ...
} else {
    // ...
}

注意:当进行类型Assert时,除非你100%确定你知道存储在接口中的类型是正确的,否则你应该总是使用“逗号ok”形式的赋值,因为如果你不使用“逗号ok”并且你不确定类型,那么你的程序迟早会崩溃。使用正常形式的赋值的不正确的类型Assert会导致运行时死机。
你也可以在if语句中做类型Assert,使代码更紧凑,但要记住,变量的作用域是if块和它的else块,在外部是不可访问的。

func Session(c *gin.Context) {
    session := sessions.Default(c)

    if v, ok := session.Get("secure").(models.Memberz); !ok {
        var data = models.Memberz{
            Name:     "test",
            Age:      0,
            Loggedin: true,
        }

        session.Set("secure", data)
        session.Save()
    } else {
        fmt.Println("data: " + v.Name)
    }

    c.JSON(200, gin.H{
        "status": "success",
    })

}

相关问题