我怎样才能正确地写出`read`和`Write``net.Pipe()`

时间:2016-04-29 07:56:01

标签: go

我正在尝试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()

的使用情况

1 个答案:

答案 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))
}

Playground