Skip to content

Commit b338eb5

Browse files
authored
Merge pull request #893 from devlights/add-buffer-to-readwritecloser-example
2 parents c276ca2 + 1fbf729 commit b338eb5

File tree

3 files changed

+64
-8
lines changed

3 files changed

+64
-8
lines changed

examples/basic/bufferop/README.md

+9-8
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@
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 に変換するサンプルです |

examples/basic/bufferop/examples.go

+1
Original file line numberDiff line numberDiff 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 numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
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+
}

0 commit comments

Comments
 (0)