golang reflect.Select 用法

 1package main
 2 
 3import (
 4	"fmt"
 5	"reflect"
 6	"strconv"
 7)
 8 
 9func main() {
10	var chs1 = make(chan int)
11	var chs2 = make(chan float64)
12	var chs3 = make(chan string)
13	var ch4close = make(chan int)
14	defer close(ch4close)
15 
16	go func(c chan int, ch4close chan int) {
17		for i := 0; i < 5; i++ {
18			c <- i
19		}
20		close(c)
21		ch4close <- 1
22	}(chs1, ch4close)
23 
24	go func(c chan float64, ch4close chan int) {
25		for i := 0; i < 5; i++ {
26			c <- float64(i) + 0.1
27		}
28		close(c)
29		ch4close <- 1
30	}(chs2, ch4close)
31 
32	go func(c chan string, ch4close chan int) {
33		for i := 0; i < 5; i++ {
34			c <- "string:" + strconv.Itoa(i)
35		}
36		close(c)
37		ch4close <- 1
38	}(chs3, ch4close)
39 
40 
41	var selectCase = make([]reflect.SelectCase, 4)
42	selectCase[0].Dir = reflect.SelectRecv
43	selectCase[0].Chan = reflect.ValueOf(chs1)
44 
45	selectCase[1].Dir = reflect.SelectRecv
46	selectCase[1].Chan = reflect.ValueOf(chs2)
47 
48	selectCase[2].Dir = reflect.SelectRecv
49	selectCase[2].Chan = reflect.ValueOf(chs3)
50 
51	selectCase[3].Dir = reflect.SelectRecv
52	selectCase[3].Chan = reflect.ValueOf(ch4close)
53 
54	done := 0
55	finished := 0
56	for finished < len(selectCase)-1 {
57		chosen, recv, recvOk := reflect.Select(selectCase)
58 
59		if recvOk {
60			done = done+1
61			switch chosen {
62			case 0:
63				fmt.Println(chosen, recv.Int())
64			case 1:
65				fmt.Println(chosen, recv.Float())
66			case 2:
67				fmt.Println(chosen, recv.String())
68			case 3:
69				finished = finished+1
70				done = done-1
71				// fmt.Println("finished\t", finished)
72			}
73		}
74	}
75	fmt.Println("Done", done)
76 
77}

发布日期:2023-04-04 22:48 字数:273 用时 2分钟
tags:golang