类型开关的俱乐部值
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{}
.
类型的值
以下代码运行良好
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{}
.