类型开关的俱乐部值

Clubbing values of type switch

以下代码运行良好

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,我已经阅读了this question

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) 并在 [=16] 处被转换为一个 string =]同时。编译器无法决定使用哪个,因此它将值还原为 interface{},因为它可以是任何值。

如果在类型开关的 case 中列出多个类型,则 switch 变量的静态类型将是原始变量的类型。 Spec: Switch statements:

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.

所以如果 switch 表达式是 v := value.(type),那么在匹配的情况下(列出多个类型)v 的类型将是 value 的类型,在你的情况下它将是interface{}。并且内置的 len() 函数不允许传递 interface{}.

类型的值