• 因为 select 没有 switch 有的 fall through 的语意,而 select 的目的只是想要从 channel 中读取数据,而不需要 switch 的判断真值操作。

  • select 跟 IO 多路复用的 select 类似,并且其作用也是类似,两者都用来管理多个 goroutine / thread ,因此选用 select 会便于记忆。


补充,同时操作大量 channel 时,单纯用 select 可能会较为繁琐, golang builtin 里的 reflect 可能会适用类似场景:

1
2
3
4
5
6
7
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)
ch := chans[chosen]
msg := value.String()