【问题标题】:Cannot use (type interface{}) as type []Type不能使用 (type interface{}) 作为类型 []Type
【发布时间】:2020-04-02 01:53:31
【问题描述】:

我有这个代码:

  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 事情

【问题讨论】:

  • 您正在执行断言,但将结果存储回 requestHistory,即interface{}。获取一个新变量(并给它正确的类型)。例如。如果您使用floatslice, ok := requestHistory.([]float64),则可以将floatsliceappendlenrange 以及任何其他可用于切片类型的内容一起使用。
  • interface{} not 表示“任何类型”。这意味着只是interface{}
  • 请在追加之前检查 requestHistory 的值,因为您尝试实现的追加可能无效,或者另一个问题是您尝试追加到错误的变量类型。请检查每个的类型变量并检查它们是否是指针引用,然后尝试追加

标签: go casting slice


【解决方案1】:

这是一些奇怪的 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{})

其中claims 是类型map[string]interface{}

【讨论】:

    猜你喜欢
    • 2020-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-19
    • 2013-09-19
    • 2018-06-28
    • 2018-09-08
    • 2015-04-22
    相关资源
    最近更新 更多