golang中select case的一点体会

先看代码:

package main

import (
    "fmt"
    "runtime"
)

func main() {
    runtime.GOMAXPROCS(1)
    int_chan := make(chan int, 1)
    string_chan := make(chan string, 1)
    int_chan <- 1
    string_chan <- "hello"
    select {
    case value := <-int_chan:
        fmt.Println(value)
    case value := <-string_chan:
        panic(value)
    }
    fmt.Println(123)
}

运行两次,结果分别为:

E:\go_study>go run 4.go
1
123

E:\go_study>go run 4.go
1
123

E:\go_study>go run 4.go
1
123

E:\go_study>go run 4.go
1
123

E:\go_study>go run 4.go
panic: hello

goroutine 1 [running]:
main.main()
        E:/go_study/4.go:18 +0x2f4
exit status 2

E:\go_study>

发现没有,如果两个case都满足条件,是伪随机选择一个执行的,而不是之前想着的从上到下依次判断哪个case能执行。

还有一点,当某个case得到执行后,就会退出select,因为打印出了 123 。

最后一点,如果没有case可以执行,则立即执行default,然后退出select。

参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 7,525评论 0 17
  • FreeCodeCamp - Basic JavaScript 写在前面: 我曾经在进谷前刷过这一套题,不过当时只...
    付林恒阅读 16,609评论 5 28
  • 1.简介 数据存储有哪些方式?电子表格,纸质文件,数据库。 那么究竟什么是关系型数据库? 目前对数据库的分类主要是...
    乔震阅读 2,075评论 0 2
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 137,134评论 19 139
  • M有如果阅读 189评论 0 0

友情链接更多精彩内容