2016-04-29 5 views
2

私はnet.Pipe()を試しています。私は"haha"文字列を書いて、それを読み返すことが良い実験かもしれないと思った。`net.Pipe()`の `Read`と` Write`を正しく書く方法

ここは私の最初のバージョンです。また、私はそれが動作ゴルーチン

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

を使用しようとしたWrite

func TestNetPipe(t *testing.T) { 
    out1 := make([]byte, 10) 
    c1, c2 := net.Pipe() 
    c1.Write([]byte("haha")) 
    c2.Read(out1) 
} 

上のブロック。しかしRead"haha"文字列全体を読むという保証はないと感じました。それは"hah"部分のみを読むかもしれません。

パッケージio/ioutilからnet.Pipe()

答えて

1

利用ReadAll機能の使用方法をデモするためのより良い方法がある場合、私は思ったんだけど。

ReadAll EOFまでの機能ブロックは、次のコードではゴルーチンの同期が必要ありません。 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

関連する問題