GoLang 使用协程与管道随机生成姓名

 1 package main
 2 
 3 import (
 4     "fmt"
 5     "math/rand"
 6     "sort"
 7     "time"
 8 )
 9 
10 //CreateRandomStr 创建100个随机字符串姓名-协程
11 func CreateRandomStr(strNameChan chan string, ExitChan chan bool) {
12     rand.Seed(time.Now().UnixNano())
13 
14     str1 := []string{"", "", "", "", "", "", "", "", "", ""}
15     str2 := []string{"", "", "", "", "", "", "", "", "", ""}
16     str3 := []string{"", "", "", "", "", "", "", "", "", ""}
17     var sum int
18     for i := 0; i < 100; i++ {
19 
20         name := fmt.Sprint(str1[rand.Intn(len(str1))], str2[rand.Intn(len(str2))], str3[rand.Intn(len(str3))])
21 
22         strNameChan <- name
23         sum++
24     }
25 
26     fmt.Printf("一共生成了 %v 个姓名
", sum)
27     close(strNameChan)
28     ExitChan <- true
29 }
30 
31 //ReadStrToSort 读取文件并按照名称姓氏排序
32 func ReadStrToSort(strNameChan chan string, sortChan chan string, ExitChan chan bool) {
33     var nameSlice []string
34     for i := 0; i < 100; i++ {
35 
36         //name := <-strNameChan
37         //nameSlice = append(nameSlice,name)
38 
39         nameSlice = append(nameSlice, <-strNameChan)
40 
41     }
42 
43     //排序
44     sort.Strings(nameSlice[:])
45     //将排好序的切片元素姓名在推入管道
46     for _, value := range nameSlice {
47         sortChan <- value
48     }
49 
50     ExitChan <- true
51     close(sortChan)
52 }
53 
54 //PrintNames 输出姓名
55 func PrintNames(sortChan chan string, ExitChan chan bool) {
56     //time.Sleep(time.Second * 3)
57     for i := 0; i < 100; i++ {
58         fmt.Printf("姓名:%v
", <-sortChan)
59     }
60 
61     ExitChan <- true
62 }
63 func main() {
64     /*
65         ● 要求:
66         ● 协程1 CreateRandomStr:创建100个随机姓名    存储到管道strNameChan
67         ● 协程2 ReadStrToSort:读取管道strNameChan里的数据 排序后写入 sortChan管道
68         ● exitChan管道    存储协程状态值
69     */
70     //创建通道
71 
72     strNameChan := make(chan string, 100)
73     sortChan := make(chan string, 100)
74     ExitChan := make(chan bool, 3)
75 
76     //开启协程
77     go CreateRandomStr(strNameChan, ExitChan)
78     go ReadStrToSort(strNameChan, sortChan, ExitChan)
79     PrintNames(sortChan, ExitChan)
80 
81     fmt.Println("主线程等待协程...")
82 
83     //主线程等待匿名函数
84     go func() {
85         for i := 0; i < 3; i++ {
86             r := <-ExitChan
87             if r != true {
88                 break
89             }
90         }
91         close(ExitChan)
92     }()
93 
94     fmt.Println("主线程结束...")
95 
96 }
View Code

 

时间若流水,恍惚间逝去
原文地址:https://www.cnblogs.com/alanshreck/p/14141406.html