V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
proxytoworld
V2EX  ›  问与答

go 代码里面的双重 select

  •  
  •   proxytoworld · 2022-02-03 16:43:55 +08:00 · 1173 次点击
    这是一个创建于 784 天前的主题,其中的信息可能已经有所发展或是发生改变。

    半年前写过一些 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
                }
    		}
    	}
    }
    
    

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

    2 条回复    2022-02-04 09:31:24 +08:00
    mcfog
        1
    mcfog  
       2022-02-03 19:32:23 +08:00 via Android
    谈不上什么技巧,就是用 select 的行为来精确判断处理各种 channel 的状态
    顺带如果你贴的代码是完整的,那这个不是什么双层 select ,内层的单分支 select 相当于没 select ,经典冗余代码
    honmaple
        2
    honmaple  
       2022-02-04 09:31:24 +08:00
    go 的 select 没有优先级,多重 select 可以实现简单的优先级
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3075 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 12:45 · PVG 20:45 · LAX 05:45 · JFK 08:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.