Невозможно использовать (интерфейс типа {}) как тип [] Тип - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть этот код:

  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 interface {}) в качестве типа [] Введите

и

Недопустимый аргумент для len

, очевидно, что это переназначение:

 requestHistory, ok = requestHistory.([]float64)

на самом деле не находится под областью действия? очень странная golang вещь, происходящая здесь

1 Ответ

0 голосов
/ 01 апреля 2020

это странная golang вещь:

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

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

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

строка, помеченная // 2, не переназначает переменную на новый тип, она поддерживает исходный тип interface{}, который объявлен из line // 1

В конечном счете, именно поэтому ошибка программирования, правильный способ сделать это - начать здесь вместо этого:

requestHistory, ok := claims["request_history"].([]interface{})

, где claims - это тип map[string]interface{}

...