go协程使用案例-读取文件

思考

思想就是想将整个程序分为3部分分别为读取模块,处理模块,写入模块,中间数据通过协程进行处理代码如下这是之前的代码

package main
import (
	"fmt"
	"strings"
	"time"
)
type LogProcess struct {
	rc chan string
	wc chan string
	path string
	influshDB string
}
func (l *LogProcess) ReadFromFile(){
	//读取模块
	message:="this is message"
	l.rc<-message
}
func (l *LogProcess) Process(){
	text:=<-l.rc
	res:=strings.ToUpper(text)
	l.wc<-res
}
func (l *LogProcess)WriteToDB(){
	//写入模块
	fmt.Println(<-l.wc)
}
func main(){
	lp:=LogProcess{
		rc:make(chan string),
		wc:make(chan string),
		path: "./111.log",
		influshDB: "./111.log",
	}
	go lp.ReadFromFile()
	go lp.Process()//处理
	go lp.WriteToDB()

	time.Sleep(1*time.Second)
}
//缺点 第一:结构单一,获取数据方式很多。不利于扩展,所以想到了go里面的接口改进如下

改进版

package main
import (
	"bufio"
	"fmt"
	"io"
	"log"
	"os"
	"strings"
	"time"
)
type LogProcess struct {
	rc chan string
	wc chan string
	read Reader
	write Writer
	path string
	file string
}
type Reader interface {
	read(rc chan string)
}
type Writer interface {
	write(wc chan string)
}
type ReadFromFile struct {//实现Reader接口将来如果别的获取数据方式可以做扩展
	path string
}
type WriterDB struct {
	dBinfo string
}
func (r *ReadFromFile) read(rc chan string){
	fd,err:=os.Open(r.path)
	if err != nil {
		log.Println("open file is fail")
		return
	}
	reader:=bufio.NewReader(fd)
	for {
		line,err:=reader.ReadBytes('\n')
		if err == io.EOF {
			time.Sleep(500 * time.Second)
			continue
		}
		if err != nil {
			panic(fmt.Sprintf("read is error %s",err.Error()))
		}
		line_str:= line[:len(line)-1]
		rc <-string(line_str)
	}
}
//处理
func (l *LogProcess) Process(){
	for v:=range l.rc {
		res:=strings.ToUpper(v)
		l.wc<-res
	}
}
func (w *WriterDB) write(wc chan string){
	for v:=range wc {
		fmt.Println(v)
	}
}
func main(){
	rc:=&ReadFromFile{
		path:"./test.log",
	}
	wc:=&WriterDB{}
	l:= &LogProcess{
		rc:make(chan string),
		wc:make(chan string),
		read: rc,
		write: wc,
	}
	go l.read.read(l.rc)
	go l.Process()
	go l.write.write(l.wc)
	time.Sleep(10*time.Second)
}

posted on   孤灯引路人  阅读(112)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
历史上的今天:
2021-12-06 jquery案例三-导航展示
2020-12-06 go文件操作
2020-12-06 go实现员工管理系统

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示