Skip to main content

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