zoukankan      html  css  js  c++  java
  • 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

     

    时间若流水,恍惚间逝去
  • 相关阅读:
    题目:输入一个链表,从尾到头打印链表每个节点的值
    【转】 文档与笔记利器 reStructuredText 和 Sphinx
    自动化selenium开发
    Sublime 3 打造成 Python/Django IDE开发利器
    python中的StringIO模块
    python检查IP地址正确性
    python2.7 使用super关键词 报错 TypeError: must be type, not&n
    【转】python time模块详解
    [黑群晖经典教程] 一步一步建立自己的黑群晖
    【转】NAS群晖DSM 5.0-4458安装教程
  • 原文地址:https://www.cnblogs.com/alanshreck/p/14141406.html
Copyright © 2011-2022 走看看