File tree 3 files changed +64
-8
lines changed
3 files changed +64
-8
lines changed Original file line number Diff line number Diff line change 2
2
3
3
このディレクトリには以下のサンプルがあります。
4
4
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) {
19
19
m ["bufferop_use_as_reader" ] = UseAsReader
20
20
m ["bufferop_use_as_writer" ] = UseAsWriter
21
21
m ["bufferop_available_buffer" ] = AvailableBuffer
22
+ m ["bufferop_to_readwritecloser" ] = ToReadWriteCloser
22
23
}
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