Skip to content

Commit a2d4712

Browse files
authored
Merge pull request #681 from devlights/add-sync-oncevalue-example
Add sync.OnceValue example
2 parents 7a5aeff + 2f04e85 commit a2d4712

File tree

4 files changed

+114
-0
lines changed

4 files changed

+114
-0
lines changed

examples/basic/syncs/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,4 @@
1515
|use\_mutex.go|syncs\_use\_mutex|sync.Mutex のサンプルです|
1616
|use\_once.go|syncs\_use\_once|sync.Onceのサンプルです|
1717
|use\_oncefunc.go|syncs\_use\_oncefunc|Go 1.21 で追加された sync.OnceFunc() のサンプルです|
18+
|use\_oncevalue.go|syncs\_use\_oncevalue|Go 1.21 で追加された sync.OnceValue() のサンプルです|

examples/basic/syncs/examples.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,5 @@ func (r *register) Regist(m mapping.ExampleMapping) {
2424
m["syncs_use_map"] = UseMap
2525
m["syncs_use_once"] = UseOnce
2626
m["syncs_use_oncefunc"] = UseOnceFunc
27+
m["syncs_use_oncevalue"] = UseOnceValue
2728
}

examples/basic/syncs/use_oncefunc.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,35 @@ func UseOnceFunc() error {
4545
output.Stdoutl("[after]", v)
4646

4747
return nil
48+
49+
/*
50+
$ task
51+
task: [build] go build .
52+
task: [run] ./try-golang -onetime
53+
54+
ENTER EXAMPLE NAME: syncs_use_oncefunc
55+
56+
[Name] "syncs_use_oncefunc"
57+
[before] 0
58+
[done] goroutine-15
59+
[done] goroutine-10
60+
[done] goroutine-3
61+
[done] goroutine-0
62+
[done] goroutine-11
63+
[done] goroutine-14
64+
[done] goroutine-6
65+
[done] goroutine-1
66+
[done] goroutine-2
67+
[done] goroutine-5
68+
[done] goroutine-12
69+
[done] goroutine-4
70+
[done] goroutine-7
71+
[done] goroutine-8
72+
[done] goroutine-9
73+
[done] goroutine-13
74+
[after] 1
75+
76+
77+
[Elapsed] 563.92µs
78+
*/
4879
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package syncs
2+
3+
import (
4+
"runtime"
5+
"sync"
6+
7+
"github.com/devlights/gomy/output"
8+
)
9+
10+
// UseOnceValue は、Go 1.21 で追加された sync.OnceValue() のサンプルです。
11+
//
12+
// # REFERENCES
13+
// - https://pkg.go.dev/sync@go1.21.4#OnceValue
14+
func UseOnceValue() error {
15+
//
16+
// Go 1.21 にて、sync.OnceValue() が追加された
17+
// 元々存在していた、sync.Once を使いやすくした感じ
18+
// 値を返却する関数を使える
19+
//
20+
21+
var (
22+
v = 0
23+
f = sync.OnceValue(func() int {
24+
v++
25+
return v
26+
})
27+
)
28+
output.Stdoutl("[before]", v)
29+
30+
var (
31+
numCpu = runtime.NumCPU()
32+
done = make(chan bool, numCpu)
33+
)
34+
for i := 0; i < numCpu; i++ {
35+
i := i
36+
go func() {
37+
result := f()
38+
done <- true
39+
output.Stderrf("[done]", "result=%d\tgoroutine-%d\n", result, i)
40+
}()
41+
}
42+
43+
for i := 0; i < numCpu; i++ {
44+
<-done
45+
}
46+
47+
output.Stdoutl("[after]", v)
48+
49+
return nil
50+
51+
/*
52+
$ task
53+
task: [build] go build .
54+
task: [run] ./try-golang -onetime
55+
56+
ENTER EXAMPLE NAME: syncs_use_oncevalue
57+
58+
[Name] "syncs_use_oncevalue"
59+
[before] 0
60+
[done] result=1 goroutine-5
61+
[done] result=1 goroutine-11
62+
[done] result=1 goroutine-4
63+
[done] result=1 goroutine-3
64+
[done] result=1 goroutine-2
65+
[done] result=1 goroutine-12
66+
[done] result=1 goroutine-14
67+
[done] result=1 goroutine-7
68+
[done] result=1 goroutine-6
69+
[done] result=1 goroutine-8
70+
[done] result=1 goroutine-0
71+
[done] result=1 goroutine-1
72+
[done] result=1 goroutine-9
73+
[done] result=1 goroutine-13
74+
[done] result=1 goroutine-15
75+
[done] result=1 goroutine-10
76+
[after] 1
77+
78+
79+
[Elapsed] 640.98µs
80+
*/
81+
}

0 commit comments

Comments
 (0)