Gin框架中单件Set GORM模型变量后在服务层中Get出来的变量如何读取字段

1. 运行环境#

go 1.21.0
gin v1.9.1
[//]: <> (当前使用的 Go 版本,及系统版本、系统架构?)
[//]: <> (使用 go version 命令查看,期望的结果如:go 1.12, linux/amd64)

2. 问题描述?#

gin 框架 gin.HandlerFunc 中间件中 c.Set("user", user),服务层中 u, _ := c.Get("user") 读取后的变量 u 是 UserInfo 类型,但是无法调用 u.Username
[//]: <> (代码问题的话,请提供一份最短的,可复现代码。或相关代码。)

func AuthMiddleware() gin.HandlerFunc {
        ...
        var user models.UserInfo
        mysql.DB.First(&user, claims.UserId)
        ...
        // 用户存在 将用户写入上下文
        c.Set("user", user)
        c.Next()
    }
}
// user 类型
type UserInfo struct {
    gorm.Model
    Username string `gorm:"username"`
    Password string `gorm:"password"`
    Email    string `gorm:"email"`
}
// 读取中间件
u, _ := c.Get("user")

3. 您期望得到的结果?#

正常取出

fmt.Println(u.ID, u.Username, u.Email)

中的值

4. 您实际得到的结果?#

fmt.Println(u.ID, u.Username, u.Email)
// 未解析的引用 'ID' 'Username' 'Email'

Go

文件上传中...

最佳答案
// ctx.Get(key) 得到的值类型是any(interface{})
// 所以只需把u转换成 models.UserInfo
// 代码如下 
user  := u.(models.UserInfo)
//这样可以取出字段了
fmt.Println(user.Id ...)
1年前 评论
讨论数量: 1
// ctx.Get(key) 得到的值类型是any(interface{})
// 所以只需把u转换成 models.UserInfo
// 代码如下 
user  := u.(models.UserInfo)
//这样可以取出字段了
fmt.Println(user.Id ...)
1年前 评论