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
}