如何在Gofiber中从本地context提取存储的用户结构体字段值
解决方法
推荐方案:类型断言(性能最高)
首先确保你定义的User结构体字段首字母大写,符合Go的字段导出规则,否则无法正常读取字段值:
type User struct { Name string `json:"name"` Email string `json:"email"` ID string `json:"id"` Password string `json:"password"` }
Go中直接使用类型断言即可将interface{}转为指定结构体,示例代码如下:
user := c.Locals("user") // 如果你的中间件存入的是User指针类型,断言语法改为 user.(*User) u, ok := user.(User) if !ok { // 断言失败处理逻辑,比如返回认证错误 c.JSON(401, gin.H{"msg": "用户认证信息无效"}) return } // 直接读取字段即可 name := u.Name email := u.Email fmt.Println("用户姓名:", name, "用户邮箱:", email)
注意事项
- 如果认证中间件存入Locals的是
*User指针类型,读取字段的语法不变,Go会自动解指针取值 - 必须加
ok判断,避免类型不匹配时触发程序panic
备选方案:JSON序列化转换(性能较低,仅做兜底)
如果不确定存入的类型结构,也可以通过JSON序列化+反序列化的方式转成结构体:
import "encoding/json" user := c.Locals("user") // 先序列化为JSON字节 jsonBytes, err := json.Marshal(user) if err != nil { c.JSON(500, gin.H{"msg": "用户信息解析失败"}) return } var u User // 反序列化到User结构体 err = json.Unmarshal(jsonBytes, &u) if err != nil { c.JSON(500, gin.H{"msg": "用户信息解析失败"}) return } name := u.Name email := u.Email
内容的提问来源于stack exchange,提问作者Barty
相关产品推荐
相关产品推荐

