2016-03-19 12 views
1

goで[]バイトバッファを再利用する適切な方法を知りたいと思います。私はこのソケットで作業するときに読み込みバッファを再利用する

buf := make([]byte, 1024) 

ようにそれを宣言してから、私はそれがメモリの割り当てを必要とするので、新しいバッファを宣言することは効率的ではないことを聞いて、この

conn, _ := net.Dial("tcp", addr) 
_, err = conn.read(buf) 

のように使用して、我々は代わりに、既存のバッファを再利用する必要があること。しかし、私はちょうどバッファを再度渡すことができるかどうかわからない、それは拭き取られるか、以前のメッセージの一部を保持できる(特にソケットからの現在のメッセージがprev.oneより短い場合)?

import "io" 

type Reader

type Reader interface { 
     Read(p []byte) (n int, err error) 
} 

リーダーPackage io

答えて

2

実際にはio.Reader.Read()を使用することはほとんどありませんが、コードではio.Readerが必要な場所でパイプを使用します。 バッファは拭き取られません。手で行う必要があります。あなたがバッファをしたい場合や、あなたがあなたが

r.WriteTo(io.Writer) //for example for further processing 

とをリセットすることができた

conn, _ := net.Dial("tcp", addr) 
r:=bufio.NewReader(conn) 

BUFIO使用することができます

r.Reset(NewConn) 
2

は、基本的なReadメソッドをラップインタフェースです。

読み取りは、pにlen(p)バイトまで読み取ります。これは、バイト数 (0 < = n < = len(p))と発生したエラーを返します。 Read がn < len(p)を返したとしても、 呼び出し中にすべてのpをスクラッチスペースとして使用することがあります。いくつかのデータが利用可能であるがlen(p)バイトではない場合、Read は通常、より多くを待つ代わりに利用可能なものを返します。

がn> 0バイトを正常に読み取った後、読み取りでエラーまたはファイルの終わりの条件が発生すると、読み取られたバイト数が返されます。 同じ呼び出しから(非nil)エラーを返したり、後続の呼び出しで エラー(およびn == 0)を返します。この一般的な例の場合、 の場合、入力ストリームの最後の に0以外のバイト数を返すReaderは、err == EOFまたはerr == nilのいずれかを返す可能性があります。 次のReadは0、EOFを返します。

呼び出し元は、エラーエラーを考慮して、 より前に返されたn> 0バイトを常に処理する必要があります。そうすることで、いくつかのバイトを読み取った後に が発生するI/Oエラーと、許可されたEOF ビヘイビアの両方が正しく処理されます。読むの

実装は、LEN(P)== 0発信者が 何も起こらなかったことを示すように0とゼロのリターンを扱う必要がある場合を除いてはnilエラーでゼロバイト 数を返すから落胆しています。 で特にEOFを示していません。

実装では、pを保持してはいけません。

Readは、コール中にすべてのバッファをスクラッチスペースとして使用することがあります。

例えば、

buf := make([]byte, 4096) 
for { 
    n, err := r.Read(buf[:cap(buf)]) 
    buf = buf[:n] 
    if err != nil { 
     // handle error 
    } 
    // process buf 
} 
3

読み取り方法は、LEN(BUF)まで読み出し、バッファにバイト読み取られたバイト数を返します。

Readメソッドは、呼び出し元のスライスの長さを変更しません。スライスが値渡しされるのでできません。アプリケーションは、実際に読み取られたバイトのスライスを取得するために、返された長さを使用する必要があります。

n, err = conn.Read(buf) 
bufRead := buf[:n] 

アプリケーションは、同じバッファを使用して複数回読み込みを呼び出すことができます。

conn, err := net.Dial("tcp", addr) 
if err != nil { 
    // handle error 
} 

buf := make([]byte, 1024) 
for { 
    n, err = conn.Read(buf) 
    if err != nil { 
     // handle error 
    } 
    fmt.Printf("Read %s\n", buf[:n]) // buf[:n] is slice of bytes read from conn 
} 
関連する問題