【问题标题】:panic interface conversion interface {} is float64 not int64恐慌接口转换接口 {} 是 float64 而不是 int64
【发布时间】:2022-01-14 12:37:13
【问题描述】:

我收到以下错误

panic: interface conversion: interface {} is float64, not int64

我不确定 float64 是从哪里来的 我将类型设置为 int64 但不确定 float64 来自哪里

type AccessDetails struct {
    AccessUuid   string  `json:"access_uuid"`
    Email        string  `json:"email"`
    Refresh      int64    `json:"refresh"`
    Expiry       int64   `json:"expiry"`
    Permission   string  `json:"permission"`
    Scope        string  `json:"scope"`
}

func GetAccessDetails(c *fiber.Ctx) (*AccessDetails, error) {
    ad := &AccessDetails{}

    cookie := c.Cookies("access_token")

    var err error
    token, err := jwt.Parse(cookie, func(token *jwt.Token) (interface{}, error) {
        return []byte(os.Getenv("ACCESS_SECRET")), nil
    })

    if err != nil {
        return nil, err
    }

    payload := token.Claims.(jwt.MapClaims)
    
    ad.Email = payload["sub"].(string)
    ad.AccessUuid = payload["access_uuid"].(string)
    ad.Refresh = payload["refresh"].(int64)
    ad.Expiry = payload["exp"].(int64)
    ad.Permission = payload["permission"].(string)
    ad.Scope = payload["scope"].(string)

    return ad, nil
}

错误似乎来自ad.Refresh = payload["refresh"].(int64)这一行 我想我只需要知道如何将类型从 float64 转换为 int64,反之亦然,用于接口 {}

我已尽一切努力将类型改回 int64,但我遇到了一个错误,现在需要帮助才能继续前进

这里是一个示例,展示了经过 jwt 解码后 cookie 中的有效负载数据的样子

{
  "access_uuid": "c307ac76-e591-41d0-a638-6dcc2f963704",
  "exp": 1642130687,
  "permission": "user",
  "refresh": 1642734587,
  "sub": "test3@example.com"
}

【问题讨论】:

  • 您能展示一下您是如何尝试从 float64 转换为 int64 的吗?
  • 我试过这个,例如ad.Refresh = int64(payload["refresh"]) 和其他人..我只想拥有 int64 就是这样
  • int64(payload["refresh"].(float64)) -- jwt.MapClaims 是一个 map[string]interface{} 并且可能使用 encoding/json 从 json 中解组,默认情况下,将 json 数字解组为 interface{}float64
  • 解释@mkopriva的注释,必须先对实际类型进行类型断言,然后再进行所需类型的转换。
  • @uberrebu “不起作用”是什么意思?你遇到了什么错误?

标签: go types jwt go-fiber


【解决方案1】:
ad.Refresh = int64(payload["refresh"].(float64))
ad.Expiry = int64(payload["exp"].(float64))

你需要先assert接口值的准确动态类型,如果成功,你可以convert它为你想要的类型。

请注意,接口值为 float64 的原因是因为这是 encoding/json 解码器在将 JSON 数字解组为 interface{} 值时的默认设置。

为了将 JSON 解组为接口值,Unmarshal 存储以下之一 这些在接口值:

bool, for JSON booleans
float64, for JSON numbers
string, for JSON strings
[]interface{}, for JSON arrays
map[string]interface{}, for JSON objects
nil for JSON null

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-10
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多