Golang io.Pipe()中 PipeReader 和 PipeWriter

PipeReader 是管道端的读取端(并没有导出字段的结构体)。他实现了io.Reader 和 io.Closer接口

type PipeReader struct{
	p *pipe
}

PipeReader.Read方法:
从管道中读取数据。该方法会堵塞,知道管道的写入端开始写入或者写入端关闭。如果写入端关闭是带有Error(即调用CloseWithError关闭),该Reader返回的error 解释写入端传递的error,否则为io.EOF。

PipeWriter(一个没有导出字段的struct)的管道写入端,。他实现了io.Writer 和 io.Closer接口

type PipeWriter struct {
	p *pipe
}

关于 PipeWriter.Write 方法的说明:写数据到管道中。该方法会堵塞,直到管道读取端读完所有数据或读取端被关闭。如果读取端关闭时带有 error(即调用 CloseWithError 关闭),该Write返回的 err 就是读取端传递的error;否则 err 为 ErrClosedPipe。

Example:


func main() {

	pipereader, pipewriter := io.Pipe()
	go Pipewrite(pipewriter)
	go PipeRead(pipereader)
	time.Sleep(20*time.Second)
}

func PipeRead(reader *io.PipeReader) {
	buf := make([]byte,128)
	for {
		fmt.Println("读出端开始阻塞五秒...")
		time.Sleep(5*time.Second)
		fmt.Println("接收端开始接收")
		n, err := reader.Read(buf)
		if err != nil {
			fmt.Println(err)
			return
		}
		fmt.Printf("收到字节: %d\n buf内容: %s\n",n,buf[:n])
	}
}

func Pipewrite(write *io.PipeWriter) {
	data := []byte("Go语言小实践")
	for i :=0;i<3 ;i++  { //写入次数 i
		n, err := write.Write(data)
		if err != nil {
			fmt.Println(err)
			return
		}
		fmt.Printf("写入字节 %d\n", n)
	}

	write.CloseWithError(errors.New("写入端关闭"))
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值