思路:一个协程处理一个文件读写和排序
package main
import (
"fmt"
"math/rand"
"os"
"strconv"
"strings"
"time"
)
func main() {
// 生成一个随机种子
rand.Seed(time.Now().UnixNano())
// 定义一个管道
fileChan := make(chan int, 10)
// 定义读写文件名称
for i := 0; i < 10; i++ {
// 随机顺序写入文件
writeFiles := "E:\\goproject\\catalogue\\write" + strconv.Itoa(i) + ".txt"
// 排序后的写入文件
sortFiles := "E:\\goproject\\catalogue\\sort" + strconv.Itoa(i) + ".txt"
go witerTxt(fileChan, writeFiles, sortFiles)
}
// 循环取出管道
for i := 0; i < 10; i++ {
<-fileChan
}
fmt.Println("Success!")
}
/**
* 随机生成数字并写入文件
**/
func witerTxt(fileChan chan int, writeFiles string, sortFiles string) {
// 生成读写文件,没有则创建
file, _ := os.OpenFile(writeFiles, os.O_RDWR|os.O_CREATE, 0666)
defer file.Close()
txt := ""
for i := 0; i < 10; i++ {
num := rand.Intn(1000)
txt += strconv.Itoa(num) + "\n"
}
_, err := file.WriteString(txt)
if err != nil {
fmt.Println(err)
}
// 文件写入后,即可对该文件进行排序从新写入新文件
sortTxt(writeFiles, sortFiles, fileChan)
}
// 读取文件内容,排序后,写入新文件
func sortTxt(readPath string, sortPath string, fileChan chan int) {
content, _ := os.ReadFile(readPath)
// 读取文件内容,按照\n 分割后放入一个切片中
slice := strings.Split(string(content), "\n")
// 将切片类型转为int
var numSlice []int
for _, v := range slice {
num, _ := strconv.Atoi(v)
numSlice = append(numSlice, num)
}
// 冒泡排序,可看我前面文章
numSlice = sort.bubbling(numSlice)
// 将排序后内容拼接后写入新文件
sortFile, _ := os.OpenFile(sortPath, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
defer sortFile.Close()
w := ""
for _, v := range numSlice {
w = w + strconv.Itoa(v) + "\n"
}
sortFile.WriteString(w)
// 该协程已执行完,向管道写入一个数据
fileChan <- 1
}
执行结果: