Skip to content

Commit 4d36f73

Browse files
committed
Add Method-Value, Method-Expresson example
1 parent 988afd8 commit 4d36f73

File tree

4 files changed

+108
-0
lines changed

4 files changed

+108
-0
lines changed

examples/basic/methods/README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,5 @@
55
|file|example name|note|
66
|----|------------|----|
77
|pointer\_or\_not.go|methods\_pointer\_or\_not|メソッドのレシーバーをポインタで宣言するかしないかの違いについてのサンプルです.|
8+
|methodvalue.go|methods\_method\_value|Goのメソッド値のサンプルです|
9+
|methodexpression.go|methods\_method\_expression|Goのメソッド式のサンプルです|

examples/basic/methods/examples.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,6 @@ func NewRegister() mapping.Register {
1414
// Regist -- 登録します.
1515
func (r *register) Regist(m mapping.ExampleMapping) {
1616
m["methods_pointer_or_not"] = PointerOrNot
17+
m["methods_method_value"] = MethodValue
18+
m["methods_method_expression"] = MethodExpression
1719
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package methods
2+
3+
import (
4+
"bytes"
5+
"io"
6+
"os"
7+
)
8+
9+
// MethodExpression は、Goのメソッド式のサンプルです.
10+
//
11+
// メソッド式と対をなすものがメソッド値となる。
12+
// メソッド値のサンプルは methodvalue.go を参照。
13+
//
14+
// # REFERENCES
15+
// - https://go.dev/ref/spec#Method_expressions
16+
// - https://zenn.dev/spiegel/articles/20201212-method-value-and-expression
17+
// - https://stackoverflow.com/questions/48883754/can-any-one-explain-this-go-program-which-uses-a-method-expression
18+
func MethodExpression() error {
19+
//
20+
// メソッド式は、インスタンスが紐づいていない状態の関数オブジェクトのこと
21+
// レシーバーが紐づいていないので、呼び出す際にレシーバーを渡す必要がある
22+
// (Python の self と思うと分かりやすい)
23+
//
24+
25+
var (
26+
buf = &bytes.Buffer{}
27+
fn = (*bytes.Buffer).Write // メソッド式
28+
data = []byte("hello world")
29+
)
30+
31+
// メソッド式は、レシーバーが紐づいていないので、第一引数にレシーバーを渡して呼び出す
32+
if _, err := fn(buf, data); err != nil {
33+
return err
34+
}
35+
36+
io.Copy(os.Stdout, buf)
37+
38+
return nil
39+
40+
/*
41+
$ task
42+
task: [build] go build .
43+
task: [run] ./try-golang -onetime
44+
45+
ENTER EXAMPLE NAME: methods_method_expression
46+
47+
[Name] "methods_method_expression"
48+
hello world
49+
50+
[Elapsed] 6.16µs
51+
*/
52+
53+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package methods
2+
3+
import (
4+
"bytes"
5+
"io"
6+
"os"
7+
)
8+
9+
// MethodValue は、Goのメソッド値のサンプルです.
10+
//
11+
// メソッド値と対をなすものがメソッド式となる。
12+
// メソッド式のサンプルは methodexpression.go を参照。
13+
//
14+
// # REFERENCES
15+
// - https://go.dev/ref/spec#Method_expressions
16+
// - https://zenn.dev/spiegel/articles/20201212-method-value-and-expression
17+
// - https://stackoverflow.com/questions/48883754/can-any-one-explain-this-go-program-which-uses-a-method-expression
18+
func MethodValue() error {
19+
//
20+
// メソッド値は、インスタンスが紐づいた状態の関数オブジェクトのこと
21+
// 既にレシーバーが紐づいているので、呼び出す際にレシーバーを渡す必要はない
22+
//
23+
24+
var (
25+
buf = &bytes.Buffer{}
26+
fn = buf.Write // メソッド値
27+
data = []byte("hello world")
28+
)
29+
30+
if _, err := fn(data); err != nil {
31+
return err
32+
}
33+
34+
io.Copy(os.Stdout, buf)
35+
36+
return nil
37+
38+
/*
39+
$ task
40+
task: [build] go build .
41+
task: [run] ./try-golang -onetime
42+
43+
ENTER EXAMPLE NAME: methods_method_value
44+
45+
[Name] "methods_method_value"
46+
hello world
47+
48+
[Elapsed] 7.22µs
49+
*/
50+
51+
}

0 commit comments

Comments
 (0)