如何在控制器中访问的中间件中使用保存在上下文中的"类型结构"

Sal*_*llu 0 struct go

这是关于GoLang的第一个问题请温柔.我正在构建一个测试JSON API.

我有一个名为User类型结构

type User struct {
    UserID              int
    Email               string
    FirstName           string
    LastName            string
    PasswordHash        string
}
Run Code Online (Sandbox Code Playgroud)

在中间件中,我验证JWT令牌是否有效,如果是,我加载用户的整个记录​​并将其保存在上下文中,以便在下面的处理程序中可用.

所以在中间件中,我像这样保存User struct

    context.Set(r, "User",  *User)
    fmt.Println(*User)

    next.ServeHTTP(w, r)
Run Code Online (Sandbox Code Playgroud)

Println的输出是

{12 sallu@domain.com.au Mr. Sallu $2a$14oUg3d1rm./.B/vUyhYR9/hlHfagE4tGicNc14EWK3u }

然后在最终的处理程序中,我访问此上下文并获取User对象.

User    := context.Get(r, "User")

fmt.Println("---User---", fmt.Sprintf(" %T ", User))
fmt.Println(User)
Run Code Online (Sandbox Code Playgroud)

Println的输出是

---User---  models.User
{12 sallu@domain.com.au Mr. Sallu $2a$14oUg3d1rm./.B/vUyhYR9/hlHfagE4tGicNc14EWK3u }
Run Code Online (Sandbox Code Playgroud)

问题是,当我访问User.Email时,我在控制器中收到错误

User.Email undefined (type interface {} is interface with no methods)
Run Code Online (Sandbox Code Playgroud)

我怎样才能解决这个问题..?我想使用User.Email或User.UserID.好像上下文正在做些什么.

请帮忙

k1m*_*90r 6

代码中的任何地方请为变量和类型使用不同的名称.

例如保持类型User和变量user.

在您的控制器中,键入断言user返回User.

if u, ok := user.(User); ok {
    fmt.Println(u.Email)
}
Run Code Online (Sandbox Code Playgroud)

https://tour.golang.org/methods/15