Go语言select、switch中使用break有用吗?

Go语言select、switch中使用break有用吗?

问题-select中使用break有用吗?

直接上select和break的示例

func test1() {
    select {
    case <-time.After(time.Second):
        fmt.Println("一秒后执行")
        //break
    }
}


func test2() {
    select {
    case <-time.After(time.Second):
        fmt.Println("一秒后执行")
        break //跳出当前select
    }
}
func main() {
    test1()
    fmt.Println("========================")
    test2()
}
/**
output:
一秒后执行
========================
一秒后执行
 */

以上代码中test1没有使用break test2使用了break。实际执行结果完全一样。可以 得出

单独在select中使用break和不使用break没有啥区别。

那么问题来了那为啥要在select中支持break呢?

实际上在select中引入break主要的目的是为了break和label组合使用,来实现跳出多层作用域。因为很多时候用select或者表达式switch语句时往往是配合for循环使用的。示例如下:

func main() {

SELECT:
    for {
        select {
        case <-time.After(time.Second):
            fmt.Println("一秒后退出")
            //break 跳出select
            break SELECT  //带标签的break,实际上跳出到select外层的for语句块
        case <-time.After(time.Second * 10):
            fmt.Println("十秒后退出")
            break
        }
    }
    
    fmt.Println("select 语句结束")
}
/**
output:
一秒后退出
select 语句结束
 */

以上例子可以看出:

带标签的break,可以跳出多层select/ switch作用域。让break更加灵活,写法更加简单灵活,不需要使用控制变量一层一层跳出循环,没有带break的只能跳出当前语句块。

问题-switch语句中使用break有用吗?

首先switch语句分为表达式switch语句和类型switch语句。

  • 表达式switch语句可以使用关键字 fallthough
  • 类型switch语句可以使用关键字 fallthough

示例1 没有fallthough的情况下的例子

func test3(i int) {
    switch {
    case i > 10:
        fmt.Println("大于10")
    case i > 8:
        fmt.Println("大于8")
    case i > 5:
        fmt.Println("大于5")
    default:
        fmt.Println("不关心")
    }
}
func test4(i int) {
    switch {
    case i > 10:
        fmt.Println("大于10")
        break
    case i > 8:
        fmt.Println("大于8")
        break
    case i > 5:
        fmt.Println("大于5")
        break
    default:
        fmt.Println("不关心")
        break
    }
}
func main() {
    test3(8)
    test4(8)
}
/**output:
大于5
大于5
 */

通过以上示例可以得出

没有fallthough的switch语句break也是没啥用的

示例2 有fallthough的例子-一般情况

func test3(i int) {
    switch i {
    case 10:
        fmt.Println("等于10")
    case 8:
        fmt.Println("等于8")
        //fallthrough
    case 5:
        fmt.Println("等于5")
    default:
        fmt.Println("不关心")
    }
}
func test4(i int) {
    switch i { 
    case 10:
        fmt.Println("等于10")
        break
    case 8:
        fmt.Println("等于8")
        break
        //fallthrough
    case 5:
        fmt.Println("等于5")
        break
    default:
        fmt.Println("不关心")
        break
    }
}
func main() {
    test3(8)
    test4(8)
}
/**output:
等于8
等于8
 */

以上例子中增加fallthough的例子

func test3(i int) {
    switch i {
    case 10:
        fmt.Println("等于10")
    case 8:
        fmt.Println("等于8")
        fallthrough
    case 5:
        fmt.Println("等于5")
    default:
        fmt.Println("不关心")
    }
}
func test4(i int) {
    switch i { 
    case 10:
        fmt.Println("等于10")
        break
    case 8:
        fmt.Println("等于8")
        break
        fallthrough
    case 5:
        fmt.Println("等于5")
        break
    default:
        fmt.Println("不关心")
        break
    }
}
func main() {
    test3(8)
    test4(8)
}
/**
output:
等于8
等于5
等于8
 */

以上例子可以看出

增加fallthrough以后会执行fallthrough后面的case语句,通过break可以跳过fallthrough的顺序执行。这种情况下break是有用的

通过select和break的分析,我们也可以推断出 带标签的break,可以跳出多层switch作用域。让break更加灵活,写法更加简单灵活,不需要使用控制变量一层一层跳出循环,没有带break的只能跳出当前语句块。(此处例子可以自行实现)

总结

1. 单独在select中使用break和不使用break没有啥区别。
2. 单独在表达式switch语句,并且没有fallthough,使用break和不使用break没有啥区别。
3. 单独在表达式switch语句,并且有fallthough,使用break能够终止fallthough后面的case语句的执行。
4. 带标签的break,可以跳出多层select/ switch作用域。让break更加灵活,写法更加简单灵活,不需要使用控制变量一层一层跳出循环,没有带break的只能跳出当前语句块。

具体select、switch、break、continue、的用法可以参考一下本人博客链接。

Go语言入门-流程控制(for、switch、select、range、break、goto、continue)

猜你喜欢

转载自blog.csdn.net/u011461385/article/details/106017483
今日推荐