猿问

恐慌接口转换接口 {} 是 float64 而不是 int64

我收到以下错误


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 的方法,但是我遇到了一个错误,现在需要帮助才能继续前进


这是 cookie 中的有效负载数据在 jwt 解码后的样子的示例


{

  "access_uuid": "c307ac76-e591-41d0-a638-6dcc2f963704",

  "exp": 1642130687,

  "permission": "user",

  "refresh": 1642734587,

  "sub": "test3@example.com"

}


慕容708150
浏览 245回答 1
1回答

慕姐4208626

ad.Refresh = int64(payload["refresh"].(float64)) ad.Expiry = int64(payload["exp"].(float64))您需要首先断言接口值的准确动态类型,然后,如果成功,您可以将其转换为您想要的类型。请注意,接口值的原因float64是因为这是encoding/json解码器在将 JSON 数字解组为interface{}值时的默认设置。为了将 JSON 解组为接口值,Unmarshal 将其中一项存储在接口值中:bool, for JSON booleansfloat64, for JSON numbersstring, for JSON strings[]interface{}, for JSON arraysmap[string]interface{}, for JSON objectsnil for JSON null
随时随地看视频慕课网APP

相关分类

Go
我要回答