go使用匿名结构体嵌入时警告
现象
使用gin + jwt-go 做jwt验证的时候,写下如下结构体
type CustomClaims struct {
Name string `json:"name"`
UserId string `json:"userId"`
// StandardClaims结构体实现了Claims接口(Valid()函数)
jwt.StandardClaims
}
初始化结构体
func (c *LoginController) generateToken(user entity.User) (string, error) {
// 构造SignKey: 签名和解签名需要使用一个值
j := helper.NewJWT()
// 构造用户claims信息(负荷)
claims := helper.CustomClaims{
user.RealName,
cast.ToString(user.Id),
jwt.StandardClaims{
NotBefore: int64(time.Now().Unix() - 1000), // 签名生效时间
ExpiresAt: int64(time.Now().Unix() + 3600), // 签名过期时间
Issuer: "yujinping.top", // 签名颁发者
},
}
// 根据claims生成token对象
token, err := j.CreateToken(claims)
if err != nil {
return "", err
}
return token, nil
}
此时,就会出现 “composite literal uses unkeyed fields” 这个警告,意思就是应该是用带有key的初始化。
修正如下
默认情况下,如果没有指定Key ,则会用默认的类型作为Key进行初始化。因此修改如下,使用StandardClaims
即可。
func (c *LoginController) generateToken(user entity.User) (string, error) {
// 构造SignKey: 签名和解签名需要使用一个值
j := helper.NewJWT()
// 构造用户claims信息(负荷)
claims := helper.CustomClaims{
Name: user.RealName,
UserId: cast.ToString(user.Id),
StandardClaims: jwt.StandardClaims{
NotBefore: int64(time.Now().Unix() - 1000), // 签名生效时间
ExpiresAt: int64(time.Now().Unix() + 3600), // 签名过期时间
Issuer: "yujinping.top", // 签名颁发者
},
}
// 根据claims生成token对象
token, err := j.CreateToken(claims)
if err != nil {
return "", err
}
return token, nil
}