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

Go 如何使用;类型struct";保存在控制器中访问的中间件的上下文中,go,struct,Go,Struct,这是我关于GoLang的第一个问题,请温柔一点。 我正在构建一个测试JSON API 我有一个名为User的类型结构 type User struct { UserID int Email string FirstName string LastName string PasswordHash string } 在中间件中,我验证JWT令牌是否有

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

我有一个名为User的类型结构

type User struct {
    UserID              int
    Email               string
    FirstName           string
    LastName            string
    PasswordHash        string
}
在中间件中,我验证JWT令牌是否有效,如果有效,我将加载用户的整个记录并将其保存在上下文中,以便在下的处理程序中可用

所以在中间件中,我像这样保存用户结构

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

    next.ServeHTTP(w, r)
Println的输出为

---User---  models.User
{12 sallu@domain.com.au Mr. Sallu $2a$14oUg3d1rm./.B/vUyhYR9/hlHfagE4tGicNc14EWK3u }
{12sallu@domain.com.auSallu先生$2a$14oUg3d1rm./.B/vUyhYR9/hlhfage4tgiccnc14ewk3u}

然后在最后一个处理程序中,我访问这个上下文并获取用户对象

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

fmt.Println("---User---", fmt.Sprintf(" %T ", User))
fmt.Println(User)
Println的输出为

---User---  models.User
{12 sallu@domain.com.au Mr. Sallu $2a$14oUg3d1rm./.B/vUyhYR9/hlHfagE4tGicNc14EWK3u }
问题是,在控制器中,当我访问User.Email时,我收到一个错误

User.Email undefined (type interface {} is interface with no methods)
我怎样才能解决这个问题。。? 我想使用User.Email或User.UserID。 似乎上下文正在对它做些什么


请帮助用户。电子邮件有点模棱两可。类型定义和变量都使用相同的名称,
User
。但是,您看到的错误消息是:

User.Email未定义(类型接口{}是没有方法的接口)

显示编译器理解
User
中存在变量,因为它认为类型是
interface{}
——Go中的泛型类型

如果我根本不使用变量,只是尝试访问类型上不存在的方法,那么您看到的错误消息与我得到的消息略有不同,例如:

package main

import(
    "fmt"
)

type User struct {
    Email           string
}

func main() {
    fmt.Println(User.Email)
}
执行时打印此错误:

User.Email未定义(类型User没有方法Email)

不过,最好将变量名更改为与类型名不同,例如

u := context.Get(r, "User")
然后您将访问
u.Email

考虑到编译器将变量视为类型
接口{}
而不是类型
用户
,biosckon可能认为您在从上下文提取后缺少类型断言是正确的。尤其见:

FromContext从上下文中提取用户IP:

另见,特别是:

您还需要使用正确的类型设置和提取值……我经常定义帮助函数来提取上下文值并执行类型断言


奇怪的是打印语句的输出,这使它看起来像是您有正确的类型。但这还是有点含糊不清,因为变量和类型使用相同的名称。而且--看起来您并没有共享所有代码--这些打印是从您第一次设置它们的范围中打印出来的,而不是从另一个范围中的上下文中提取出来的吗?如果是这样的话,这就解释了区别。

User.Email
有点模棱两可。类型定义和变量都使用相同的名称,
User
。但是,您看到的错误消息是:

User.Email未定义(类型接口{}是没有方法的接口)

显示编译器理解
User
中存在变量,因为它认为类型是
interface{}
——Go中的泛型类型

如果我根本不使用变量,只是尝试访问类型上不存在的方法,那么您看到的错误消息与我得到的消息略有不同,例如:

package main

import(
    "fmt"
)

type User struct {
    Email           string
}

func main() {
    fmt.Println(User.Email)
}
执行时打印此错误:

User.Email未定义(类型User没有方法Email)

不过,最好将变量名更改为与类型名不同,例如

u := context.Get(r, "User")
然后您将访问
u.Email

考虑到编译器将变量视为类型
接口{}
而不是类型
用户
,biosckon可能认为您在从上下文提取后缺少类型断言是正确的。尤其见:

FromContext从上下文中提取用户IP:

另见,特别是:

您还需要使用正确的类型设置和提取值……我经常定义帮助函数来提取上下文值并执行类型断言


奇怪的是打印语句的输出,这使它看起来像是您有正确的类型。但这还是有点含糊不清,因为变量和类型使用相同的名称。而且--看起来您并没有共享所有代码--这些打印是从您第一次设置它们的范围中打印出来的,而不是从另一个范围中的上下文中提取出来的吗?如果是这样的话,这就解释了差异。

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

e、 g.保留类型
User
和变量
User

在控制器中,键入assert your
user
返回到
user

如果u,确定:=用户(用户);嗯{
fmt.Println(美国电子邮件)
}

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

e、 g.保留类型
User
和变量
User

在控制器中,键入assert your
user
返回到
user

如果u,确定:=用户(用户);嗯{
fmt.Println(美国电子邮件)
}

开始时,不要对类型和变量名使用相同的名称。例如,如果您不是直接从其他软件包访问变量,请将变量保留为
user
(未导出)。当用户输入上下文机器时,它的类型为
user
。当它从另一端出来时,它就会松开:)。您需要键入assert并将其返回到
User
。首先,不要对类型和变量名使用相同的名称。例如,如果您不是直接从其他软件包访问变量,请将变量保留为
user
(未导出)。当用户输入上下文机器时,它的类型为
user
。当它在另一条路上传播时