go 代码里面的双重 select

2022-02-03 16:43:55 +08:00
 proxytoworld

半年前写过一些 go 代码,当时见到过双重 select 技巧,现在忘了,有大哥知道的能说说吗,结构大概是下面这样

func twork(job <-chan string, st <-chan int) {
	defer wg.Done()
	for {
		select {
		case s, ok := <-job:
			if ok {
				fmt.Println("job:", s)
			} else {
				return
			}

		case sti, ok := <-st:
			if ok {
				if sti == 2 {
					fmt.Println("return channel")
					return
				} else if sti == 1 {
					fmt.Println("type 1")
					continue
				}
			} else {
				return
			}
		default:
			select {
            	case sti, ok := <-st:
                	do something
            }
		}
	}
}

查了半天没查到类似的代码,能解释一下应用场景是什么吗

1180 次点击
所在节点    问与答
2 条回复
mcfog
2022-02-03 19:32:23 +08:00
谈不上什么技巧,就是用 select 的行为来精确判断处理各种 channel 的状态
顺带如果你贴的代码是完整的,那这个不是什么双层 select ,内层的单分支 select 相当于没 select ,经典冗余代码
honmaple
2022-02-04 09:31:24 +08:00
go 的 select 没有优先级,多重 select 可以实现简单的优先级

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/831777

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX