我有这个代码:

  requestHistory := claims["request_history"]

  if requestHistory == nil {
     requestHistory = []float64{}
  }

  requestHistory, ok = requestHistory.([]float64)

  if !ok {
    return getBytes(http.StatusForbidden, cptypes.ErrorResponseData{
      ErrId:  "7d700df9-6cc9-447c-a8ce-37701fd71a8c",
      Reason: "missing created_at value in jwt claims.",
    })
  }

  requestHistory = append(requestHistory, float64(time.Now().Unix()))  // error here!

  if len(requestHistory) > 25 {   // error here too!
      //
  }

我无法弄清楚为什么会出现此错误:

无法将'requestHistory'(类型接口{})用作类型[] Type



len的无效参数

很明显,这种重新分配:
 requestHistory, ok = requestHistory.([]float64)

实际不在范围内吗?非常奇怪的golang事情在这里发生

最佳答案

这是一些奇怪的golang事情:

  requestHistory := claims["request_history"]    // 1

  if requestHistory == nil {
     requestHistory = []float64{}
  }

  requestHistory, ok = requestHistory.([]float64)   // 2

标记为// 2的行不会将变量重新分配为新类型,它会保留从// // 1行声明的interface{}的原始类型

最终这就是为什么编程错误,正确的方法是从这里开始:
requestHistory, ok := claims["request_history"].([]interface{})

其中claimsmap[string]interface{}类型

10-06 13:16