老师的题目上需求感觉很不明确,自己觉的这道练习题关于管道只有在最后判断所有协程是否都执行完毕时做一下判断用,虽然方法里面用到了但感觉有些多余了,小伙伴们有问题可以问我
package main
import (
"bufio"
"fmt"
"io"
"math/rand"
"os"
"sort"
"strconv"
"strings"
"time"
)
var writeFile string = "write"
var sortFile string = "sort"
var methodNum int = 2
//用于统计协程是否执行完成
var endchan chan bool = make(chan bool, methodNum*2)
func main() {
// 先写
go writeText("write.txt")
// 等待写入完成
for {
if len(endchan) == 1 {
break
}
}
//再排序
go readAndsort("write.txt", "sort.txt")
// 等待排序完成
for {
if len(endchan) == 2 {
break
}
}
}
// 写入文件
func writeText(fileName string) {
var numchan chan string = make(chan string, 4)
//打开文件
file, _ := os.OpenFile(fileName, os.O_CREATE, 0666)
defer file.Close()
// 以纳秒时间戳设置随机数种子,这样多个协程执行时不会出现随机数一样的情况了
rand.Seed(time.Now().UnixNano())
// 将随机数放入管道
for {
numchan <- (strconv.Itoa(rand.Intn(10))) //设置随机数范围为 2000
if len(numchan) == 4 {
break
}
}
//写入数据到文件中
for {
io.WriteString(file, <-numchan+"\n")
if len(numchan) == 0 {
break
}
}
close(numchan)
//程序结束时做标记
endchan <- true
}
//读取文件
func readAndsort(fileName string, sortFile string) {
//定义切片用于排序使用
var numlist []int
//打开文件
file, _ := os.OpenFile(fileName, os.O_CREATE, 0666)
defer file.Close()
//读取数据
inputReader := bufio.NewReader(file)
for {
//读到换行符时截取
readString, readerError := inputReader.ReadString('\n')
//去除读取的数据中带有的换行符,方便存储排序使用
readString = strings.Replace(readString, "\n", "", -1)
fmt.Printf(" str", readString)
fmt.Println()
//最后会读到末尾的空串所以需要筛选
if readString != "" {
//string 转 int
tempint, _ := strconv.Atoi(readString)
numlist = append(numlist, tempint)
}
//读到文件末尾跳出循环
if readerError == io.EOF {
break
}
}
//调用方法排序
sort.Ints(numlist)
//打开文件
newfile, _ := os.OpenFile(sortFile, os.O_CREATE, 0666)
defer newfile.Close()
//将排序后的切片遍历放入文件
for i := 0; i < len(numlist); i++ {
// int 转 string
str := strconv.Itoa(numlist[i])
io.WriteString(newfile, str+"\n")
}
//程序结束时做标记
endchan <- true
}