![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }