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("写入端关闭"))
}