您可以使用reflect包中的
Select函数执行此操作:
func Select(cases []SelectCase) (chosen int, recv Value, recvOK bool)Select执行案例列表中描述的选择操作。类似于Go
select语句,它阻塞直到至少一种情况可以继续进行,做出统一的伪随机选择然后执行该情况。它返回所选案例的索引,如果该案例是接收操作,则返回接收到的值和一个布尔值,指示该值是否对应于通道上的发送(而不是由于通道关闭而接收到的零值)。
您传递一个
SelectCase结构数组,这些结构标识要选择的通道,操作的方向以及在发送操作的情况下要发送的值。
因此,您可以执行以下操作:
cases := make([]reflect.SelectCase, len(chans))for i, ch := range chans { cases[i] = reflect.SelectCase{Dir: reflect.SelectRecv, Chan: reflect.ValueOf(ch)}}chosen, value, ok := reflect.Select(cases)// ok will be true if the channel has not been closed.ch := chans[chosen]msg := value.String()您可以在此处尝试更加充实的示例:http :
//play.golang.org/p/8zwvSk4kjx



