go switch
在 Go 中,switch 语句有几种不同的形式:
1. 表达式 switch
这是最常见的形式,用于匹配一个表达式的值。
switch expr {
case val1:
// 当 expr == val1 时执行
case val2:
// 当 expr == val2 时执行
default:
// 如果没有匹配的 case,则执行这里
}
2. 无条件 switch
这种形式没有条件表达式,每个 case 是一个布尔表达式。
switch {
case condition1:
// 当 condition1 为 true 时执行
case condition2:
// 当 condition2 为 true 时执行
default:
// 如果没有匹配的 case,则执行这里
}
3. 类型 switch
用于检查接口变量的具体类型。
var i interface{} = getValue()
switch v := i.(type) {
case int:
// i 是 int 类型
case string:
// i 是 string 类型
default:
// i 是其他类型
}
使用建议
- 表达式
switch:适合用于需要比较具体值的情况。 - 无条件
switch:适合用于多个布尔条件的判断,类似if-else。 - 类型
switch:适合用于接口类型断言,判断具体类型。
这些形式可以根据具体需求灵活使用,帮助简化代码逻辑。
GVA项目
在 Go 中,switch 语句可以用于多种情况。你展示的代码使用的是一种没有条件表达式的 switch,这种形式的 switch 会依次检查每个 case 的条件,就像一系列的 if-else 语句。
这种 switch 的工作方式
- 无条件表达式:
switch语句没有条件表达式,因此case条件可以是任意的布尔表达式。 - 类似
if-else:每个case的条件会被依次检查,直到找到第一个为true的条件。
示例解释
switch {
case v == "notEmpty":
// 检查字段是否为空
if isBlank(val) {
return errors.New(tagVal.Name + "值不能为空")
}
case strings.Split(v, "=")[0] == "regexp":
// 使用正则表达式验证字段格式
if !regexpMatch(strings.Split(v, "=")[1], val.String()) {
return errors.New(tagVal.Name + "格式校验不通过")
}
case compareMap[strings.Split(v, "=")[0]]:
// 进行比较验证
if !compareVerify(val, v) {
return errors.New(tagVal.Name + "长度或值不在合法范围," + v)
}
}
在这个代码段中:
- 第一个
case检查v是否等于"notEmpty"。 - 第二个
case检查v是否是以"regexp="开头。 - 第三个
case检查compareMap中是否存在v的键。
这种形式的 switch 语句在需要检查多个不同条件时非常有用,避免了多层嵌套的 if-else。