在select里怎么保证case chan的先后顺序呢?

select {
    case <-c1:
    case <-c2:
    case <-c3:
}

假如想让c1在c2,c3之前执行,该怎么修改下代码呢?

已邀请:

xieyanke - 职业打杂儿,业余编程……

赞同来自: wuhan

你这个实现思路有问题,如果要保证先后顺序,就不应该使用 select

Lixz

赞同来自: cloverstd

select {
    case <-c1:
    default:
    select{
        case <-c2:
        case <-c3:
    }
}

h12 - https://h12.me

赞同来自:

你觉得呢?

gone - whatever

赞同来自:

绝对不允许c2/c3在c1之前执行的话:

<-c1

select {
    case <-c2:
    case <-c3:
}

允许c2/c3在xx时间后绕过c1的话:

select {
    case <-c1:
    case <-time.After(...):
}

select {
    case <-c2:
    case <-c3:
}

lvpengzhen

赞同来自:

default

DilonWu - https://github.com/AceDarkknight

赞同来自:

done:=make(chan bool, 1)
go func(){
    <-c1
    done <- true
}
select{
    case <-done:
        <-c2
        <-c3
    default:
}

arthur1024 - 关注高并发、高可用架构、乐于分享和传播

赞同来自:

select 中channel是随机的,没办法做到谁先谁后

lichao2018

赞同来自:

有没有考虑过c2或c3有数据而c1没数据的情况?c2要等待c1吗

Xargin - 滴滴打杂工

赞同来自:

这面试题。。。

我直接把 runtime select.go 的 pollorder 改了得了

要回复问题请先登录注册