老师的题目上需要感觉很不明确,本人觉的这道练习题对于管道只有在最初判断所有协程是否都执行结束时做一下判断用,尽管办法外面用到了但感觉有些多余了,小伙伴们有问题能够问我😘
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
}