我怎样才能正确编写 `Read` 和 `Write` 的 `net.Pipe()`

zjk*_*zjk 5 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)
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用 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)
}
Run Code Online (Sandbox Code Playgroud)

有用。但我觉得不能保证Read会读取整个"haha"字符串。它可能只读取"hah"部分。

我想知道是否有更好的方法来演示使用 net.Pipe()

Grz*_*Żur 7

使用ReadAll包中的函数io/ioutil

由于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))
}
Run Code Online (Sandbox Code Playgroud)

Playground