go lang的多线程示例 写文件并且排序 和单元测试

待测试函数包:

package sortFile

import(
	"io/ioutil"
	"math/rand"
	"time"
	"strings"
	"strconv"
	"fmt"
	"path/filepath"
	"os"
	"sort"
)
const threadChanNu = 10
const randMaxNu =1000

// 写入数据
func WriteFile(allFilePath,s string)bool {
	dir,_ := filepath.Split(allFilePath)
	_,err := os.Stat(dir)
	if err != nil  {
		os.MkdirAll(dir,os.ModePerm)
	}
	err = ioutil.WriteFile(allFilePath,[]byte(s),0666)
	if err != nil  {
		return false
	}
	return true
}

func writeDataToFile(v int,fileNameInt int)    {
	//1. 开始产生数据
	rand.Seed(time.Now().UnixNano())
	randSplice := make([]string,v)
	for dix := 0; dix < v; dix++ {
		randSplice[dix] =strconv.Itoa(rand.Intn(v)) 
	}
	//2. 开始写入文件中 e:/chan/v.txt
	writePath := "e:/chan/"+strconv.Itoa(fileNameInt)+".txt"
	bl := WriteFile(writePath,strings.Join(randSplice,","))
	if !bl {
		fmt.Println("写入文件错误!")
		return
	}
	fmt.Println(writePath,"写入完成")
	flgChan<- fileNameInt
}

func ReadDataAndStoreWrtie(path string)  {
	//1. 判断文件路径是否存在
	 _,err := os.Lstat(path)
	 if err != nil  {
		 fmt.Println("读取文件错误!filePath:",path)
		 return 
	 }
	 //2. 读取文件内内容
	 var readSpliceByte []byte 
	 readSpliceByte,err = ioutil.ReadFile(path)
	 if err != nil  {
		 return
	 }
	 readStrSlice := strings.Split(string(readSpliceByte),",")
	 readIntSlice := make([]int , len(readStrSlice))
	 for idx, v := range readStrSlice {
		readIntSlice[idx],_ = strconv.Atoi(v)
	 }
	 sort.Ints(readIntSlice);
	 var  build strings.Builder
	 for _, v := range readIntSlice {
		build.WriteString(strconv.Itoa(v)+",")
	 }
	 fileName := filepath.Base(path)
	 fileNoExt := fileName[:strings.LastIndex(fileName,".")] 
	 fmt.Println("文件名为:",fileNoExt)
	 WriteFile("e:/chan/"+fileNoExt+"_stor.txt",build.String())
	 
}

var flgChan =make(chan int ,threadChanNu)

//练习一  
func GoroutineOne()  {
	for i := 0; i < threadChanNu; i++ {
		go  writeDataToFile(randMaxNu,i)
	}
	
	for i := 0; i < threadChanNu; i++ {
		val := <- flgChan
		// 开启读取线程  排序后再写入另外一个文件
		go ReadDataAndStoreWrtie("e:/chan/"+strconv.Itoa(val)+".txt")
	}
	close(flgChan)
}

单元测试文件sort_test.go:
方法名Test开始,后边第一个字母不能小写
运行命令 go test -v 全部测试
指定测试文件测试 go test -v 测试文件名.go 依赖文件名.go
指定方法的我运行不成功: 网上说是 go test -v -test.run 方法名

package sortFile

import(
	"testing"
	"fmt"
)

func TestGoroutineOne(t *testing.T)  {
	GoroutineOne()
	fmt.Println("运行完毕!")
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

望天hous

你的鼓励是我最大动力~谢谢啦!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值