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年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!