funcmain() { var ch1 = make(chanint, 10) var ch2 = make(chanint, 10)
// 创建SelectCase var cases = createCases(ch1, ch2)
// 执行10次select for i := 0; i < 10; i++ { chosen, recv, ok := reflect.Select(cases) if recv.IsValid() { // recv case fmt.Println("recv:", cases[chosen].Dir, recv, ok) } else { // send case fmt.Println("send:", cases[chosen].Dir, ok) } } }
funccreateCases(chs ...chanint) []reflect.SelectCase { var cases []reflect.SelectCase
// 创建recv case for _, ch := range chs { cases = append(cases, reflect.SelectCase{ Dir: reflect.SelectRecv, Chan: reflect.ValueOf(ch), }) }
// 创建send case for i, ch := range chs { v := reflect.ValueOf(i) cases = append(cases, reflect.SelectCase{ Dir: reflect.SelectSend, Chan: reflect.ValueOf(ch), Send: v, }) }