我正在尝试net.Pipe()
。我想写"haha"
字符串然后再读它可能是一个很好的实验。
这是我的第一个版本。它会阻止Write
func TestNetPipe(t *testing.T) {
out1 := make([]byte, 10)
c1, c2 := net.Pipe()
c1.Write([]byte("haha"))
c2.Read(out1)
}
我尝试使用goroutine
func TestNetPipe(t *testing.T) {
out1 := make([]byte, 10)
c1, c2 := net.Pipe()
go func() {
c1.Write([]byte("haha"))
}()
fmt.Printf("%v\n", out1)
c2.Read(out1)
fmt.Printf("%v\n", out1)
}
有效。但我觉得无法保证Read
会读取整个"haha"
字符串。它可能只读取"hah"
部分。
我想知道是否有更好的方法来演示net.Pipe()
答案 0 :(得分:1)
使用包io/ioutil
中的ReadAll
功能。
当ReadAll
函数阻塞到EOF之前,以下代码不需要同步goroutine。 close
方法的调用会导致流上的EOF。
package main
import (
"fmt"
"io/ioutil"
"log"
"net"
)
func main() {
r, w := net.Pipe()
go func() {
w.Write([]byte("haha"))
w.Close()
}()
b, err := ioutil.ReadAll(r)
if err != nil {
log.Fatalf(err.Error())
}
fmt.Println(string(b))
}