Следующий код работает нормально
var requestMap map[string]interface{}
for _, value := range requestMap {
switch v := value.(type) {
case []interface{}:
if len(v) == 0 {
// if is empty then no need to throw NA
return http.StatusOK, nil
}
case string:
if len(v) == 0 {
// if is empty then no need to throw NA
return http.StatusOK, nil
}
}
}
Но следующий код дает invalid argument for len function
, я прочитал этот вопрос
var requestMap map[string]interface{}
for _, value := range requestMap {
switch v := value.(type) {
case []interface{}, string:
if len(v) == 0 {
// if is empty then no need to throw NA
return http.StatusOK, nil
}
}
}
Разве этого оператора case недостаточно, чтобы идентифицировать []interface{}
или string
как тип значения?
Почему он до сих пор рассматривает interface{}
как параметр len()
Это связано с тем, что в случае переключения типа v
следует преобразовать в фрагмент интерфейса ([]interface
) и в string
в в то же время. Компилятор не может решить, что использовать, поэтому он возвращает значение обратно к interface{}
, так как это может быть что угодно.
Если вы перечислите несколько типов в case
переключателя типа, статический тип переменной switch
будет иметь тип исходной переменной. Спецификация: операторы Switch:
In clauses with a case listing exactly one type, the variable has that type; otherwise, the variable has the type of the expression in the TypeSwitchGuard.
Таким образом, если выражением переключения является v := value.(type)
, то v
в соответствующем случае (перечисление нескольких типов) будет типом value
, в вашем случае это будет interface{}
. А встроенная функция len()
не позволяет передавать значения типа interface{}
.