File tree Expand file tree Collapse file tree 3 files changed +64
-8
lines changed
Expand file tree Collapse file tree 3 files changed +64
-8
lines changed Original file line number Diff line number Diff line change 22
33このディレクトリには以下のサンプルがあります。
44
5- | file | example name | note |
6- | ------------------ | ------------------------- | -------------------------------------------------------------------- |
7- | zerovalue.go | bufferop_zero_value | bytes.Buffer を ゼロ値 で利用した場合のサンプルです |
8- | frombytes.go | bufferop_from_bytes | bytes.Buffer を バイト列 から生成するサンプルです |
9- | fromstring.go | bufferop_from_string | bytes.Buffer を 文字列 から生成するサンプルです |
10- | use_as_reader.go | bufferop_use_as_reader | bytes.Buffer を io.Reader として利用するサンプルです |
11- | use_as_writer.go | bufferop_use_as_writer | bytes.Buffer を io.Writer として利用するサンプルです |
12- | availablebuffer.go | bufferop_available_buffer | Go 1.21 で追加された Buffer.AvailableBuffer() についてのサンプルです |
5+ | file | example name | note |
6+ | --------------------- | --------------------------- | -------------------------------------------------------------------- |
7+ | zerovalue.go | bufferop_zero_value | bytes.Buffer を ゼロ値 で利用した場合のサンプルです |
8+ | frombytes.go | bufferop_from_bytes | bytes.Buffer を バイト列 から生成するサンプルです |
9+ | fromstring.go | bufferop_from_string | bytes.Buffer を 文字列 から生成するサンプルです |
10+ | use_as_reader.go | bufferop_use_as_reader | bytes.Buffer を io.Reader として利用するサンプルです |
11+ | use_as_writer.go | bufferop_use_as_writer | bytes.Buffer を io.Writer として利用するサンプルです |
12+ | availablebuffer.go | bufferop_available_buffer | Go 1.21 で追加された Buffer.AvailableBuffer() についてのサンプルです |
13+ | to_readwritecloser.go | bufferop_to_readwritecloser | bytes.Buffer を io.ReadWriteCloser に変換するサンプルです |
Original file line number Diff line number Diff line change @@ -19,4 +19,5 @@ func (r *register) Regist(m mapping.ExampleMapping) {
1919 m ["bufferop_use_as_reader" ] = UseAsReader
2020 m ["bufferop_use_as_writer" ] = UseAsWriter
2121 m ["bufferop_available_buffer" ] = AvailableBuffer
22+ m ["bufferop_to_readwritecloser" ] = ToReadWriteCloser
2223}
Original file line number Diff line number Diff line change 1+ package bufferop
2+
3+ import (
4+ "bytes"
5+ "io"
6+ "os"
7+ )
8+
9+ // ToReadWriteCloser は、bytes.Buffer を io.ReadWriteCloser に変換するサンプルです.
10+ //
11+ // bytes.Bufferは、既に io.Reader と io.Writer を実装していますが
12+ // io.Closer は実装していません。そのため、そのままでは
13+ // os.File や net.Conn のように io.ReadWriteCloser としては利用できません。
14+ //
15+ // bytes.Bufferをラップし、Closeメソッドを空実装した型を別途用意すれば良いのですが面倒です。
16+ // リミテッドな使い方(特定の関数に渡したいだけ)の場合は、匿名構造体と io.NopCloser を利用した方が楽です。
17+ //
18+ // # REFERENCES
19+ // - https://zenn.dev/nobonobo/articles/297dc5cbc554d6
20+ func ToReadWriteCloser () error {
21+ // funcs
22+ var (
23+ // 変換
24+ c = func (b * bytes.Buffer ) io.ReadWriteCloser {
25+ // 匿名構造体を使って、io.ReadWriteCloser の実装を用意。
26+ // io.ReadWriteCloser は io.Reader, io.Writer, io.Closer の合成インターフェースとなる。
27+ // なので、その3つを実装していれば良いことになる。
28+ return & struct {
29+ io.ReadCloser // io.Reader と io.Closer
30+ io.Writer // io.Writer
31+ }{
32+ io .NopCloser (b ), // io.ReaderはBufferが実装済み。io.Closerは空実装。
33+ b , // io.ReaderはBufferが実装済み。
34+ }
35+ }
36+ // 書き込み
37+ w = func (rwc io.ReadWriteCloser ) {
38+ _ , _ = rwc .Write ([]byte ("hello\n " ))
39+ }
40+ // 読み込み
41+ r = func (rwc io.ReadWriteCloser ) {
42+ io .Copy (os .Stdout , rwc )
43+ }
44+ )
45+
46+ var (
47+ b bytes.Buffer
48+ rwc = c (& b )
49+ )
50+ w (rwc )
51+ r (rwc )
52+
53+ return nil
54+ }
You can’t perform that action at this time.
0 commit comments