Skip to content

Commit c152965

Browse files
authored
Merge pull request #245 from devlights/add-ioutil-nopcloser-example-#241
Add ioutil.NopCloser example
2 parents e2fbb4b + 08e83ce commit c152965

File tree

4 files changed

+90
-0
lines changed

4 files changed

+90
-0
lines changed

examples/basic/examples.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"github.com/devlights/try-golang/examples/basic/helloworld"
1818
"github.com/devlights/try-golang/examples/basic/ifs"
1919
"github.com/devlights/try-golang/examples/basic/imports"
20+
"github.com/devlights/try-golang/examples/basic/iointerfaces"
2021
"github.com/devlights/try-golang/examples/basic/literals"
2122
"github.com/devlights/try-golang/examples/basic/logging"
2223
"github.com/devlights/try-golang/examples/basic/maps"
@@ -68,6 +69,7 @@ func (r *register) Regist(m mappings.ExampleMapping) {
6869
helloworld.NewRegister().Regist(m)
6970
ifs.NewRegister().Regist(m)
7071
imports.NewRegister().Regist(m)
72+
iointerfaces.NewRegister().Regist(m)
7173
literals.NewRegister().Regist(m)
7274
logging.NewRegister().Regist(m)
7375
maps.NewRegister().Regist(m)

examples/basic/iointerfaces/doc.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
/*
2+
Package iointerfaces -- ioパッケージ配下やそれに関わるインターフェースについてのサンプルが配置されています.
3+
*/
4+
package iointerfaces
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package iointerfaces
2+
3+
import (
4+
"github.com/devlights/try-golang/mappings"
5+
)
6+
7+
type (
8+
register struct{}
9+
)
10+
11+
// NewRegister -- このパッケージ用のサンプルを登録する mappings.Register を生成します。
12+
func NewRegister() mappings.Register {
13+
return new(register)
14+
}
15+
16+
// Regist -- 登録します.
17+
func (r *register) Regist(m mappings.ExampleMapping) {
18+
m["iointerfaces_nopcloser"] = UsingNopCloser
19+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package iointerfaces
2+
3+
import (
4+
"bytes"
5+
"io"
6+
"io/ioutil"
7+
8+
"github.com/devlights/gomy/output"
9+
)
10+
11+
type (
12+
// _readcloserimpl -- サンプル用 io.ReadCloser の実装
13+
_readcloserimpl struct {
14+
reader io.Reader
15+
}
16+
)
17+
18+
// Impl check
19+
var _ io.ReadCloser = (*_readcloserimpl)(nil)
20+
21+
// Impl -- io.Reader#Read
22+
func (r *_readcloserimpl) Read(p []byte) (int, error) {
23+
return r.reader.Read(p)
24+
}
25+
26+
// Impl -- io.Closer#Close
27+
func (r *_readcloserimpl) Close() error {
28+
output.Stdoutl("[_readcloserimpl]", "Close() called")
29+
return nil
30+
}
31+
32+
// UsingNopCloser -- ioutil.NopCloser についてのサンプルです.
33+
//
34+
// REFERENCES:
35+
// - https://golang.org/pkg/io/ioutil/#NopCloser
36+
func UsingNopCloser() error {
37+
// ------------------------------------------------------------
38+
// ioutil.NopCloser は、Closeが呼ばれても何もしない
39+
// io.ReadCloser を返す.
40+
//
41+
// 処理内部で Close メソッドが呼ばれてしまうが
42+
// そのタイミングで Close はしてほしくない場合などで利用できる.
43+
// ------------------------------------------------------------
44+
var (
45+
r = bytes.NewReader([]byte("hello"))
46+
reader = &_readcloserimpl{reader: r}
47+
nopcloser = ioutil.NopCloser(reader)
48+
)
49+
50+
// NopCloser は、Close のみ何もしないインターフェースなので
51+
// Readは問題なく実行できる
52+
buf := make([]byte, 3)
53+
_, _ = nopcloser.Read(buf)
54+
output.Stdoutl("[nopcloser.Read]", buf)
55+
56+
// Close を呼び出しても何も起きない
57+
output.Stdoutl(">>", "before NopCloser.Close")
58+
_ = nopcloser.Close()
59+
output.Stdoutl(">>", "after NopCloser.Close")
60+
61+
// 実際の io.Closer の Close を呼び出し
62+
_ = reader.Close()
63+
64+
return nil
65+
}

0 commit comments

Comments
 (0)