go标准包里Pipe方法出现在io,net,os三个包中,其中os.Pipe()内部实现是基于系统调用Pipe来实现的,暂且不表。
io.Pipe()和net.Pipe()都是使用channel和Lock来实现的。
区别是在于io.Pipe()返回的是一个Reader,一个Writer。
net.Pipe()返回的是一个ReaderWriter,和一个ReaderWriter,即两个返回值都有Read()和Write()方法。

但在使用的时候,要注意的是,Reader和Writer内部是公用一个channel,Write里面同样也有锁。
调用Write([]byte) 后,会阻塞等待另外的协程调用Read()并把byte读完,

官方文档里的一个例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package main

import (
"bytes"
"fmt"
"io"
)

func main() {
r, w := io.Pipe()

go func() {
fmt.Fprint(w, "some text to be read\n")
w.Close()
}()

buf := new(bytes.Buffer)
buf.ReadFrom(r)
fmt.Print(buf.String())

}

我的一个例子

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
32
33
34
package main

import (
"io"
"log"
)

func main() {
r, w := io.Pipe()
s := "hello world"
length := len(s)

go func() {
for {
w.Write([]byte(s))
//w.Close()
}
}()

go func() {
for {
b := make([]byte, length)
n, err := r.Read(b)
if err != nil {
log.Println(err.Error())
}
if len(b) != 0 {
log.Println(string(b), n)
}
}
}()

select {}
}