Skip to content

Commit 46d4ed4

Browse files
authored
Merge pull request #682 from devlights:add-sync-oncevalues-example
Add sync.OnceValues example
2 parents a2d4712 + 80962ef commit 46d4ed4

File tree

3 files changed

+77
-0
lines changed

3 files changed

+77
-0
lines changed

examples/basic/syncs/README.md

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

examples/basic/syncs/examples.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,5 @@ func (r *register) Regist(m mapping.ExampleMapping) {
2525
m["syncs_use_once"] = UseOnce
2626
m["syncs_use_oncefunc"] = UseOnceFunc
2727
m["syncs_use_oncevalue"] = UseOnceValue
28+
m["syncs_use_oncevalues"] = UseOnceValues
2829
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package syncs
2+
3+
import (
4+
"runtime"
5+
"sync"
6+
7+
"github.com/devlights/gomy/output"
8+
)
9+
10+
// UseOnceValues は、Go 1.21 で追加された sync.OnceValues() のサンプルです。
11+
//
12+
// # REFERENCES
13+
// - https://pkg.go.dev/sync@go1.21.4#OnceValues
14+
func UseOnceValues() error {
15+
var (
16+
v = 0
17+
f = sync.OnceValues(func() (int, error) {
18+
v++
19+
return v, nil
20+
})
21+
)
22+
output.Stdoutl("[before]", v)
23+
24+
var (
25+
numCpu = runtime.NumCPU()
26+
done = make(chan bool, numCpu)
27+
)
28+
for i := 0; i < numCpu; i++ {
29+
i := i
30+
go func() {
31+
result, err := f()
32+
done <- true
33+
output.Stderrf("[done]", "result=%d\terr=%v\tgoroutine-%d\n", result, err, i)
34+
}()
35+
}
36+
37+
for i := 0; i < numCpu; i++ {
38+
<-done
39+
}
40+
41+
output.Stdoutl("[after]", v)
42+
43+
return nil
44+
45+
/*
46+
$ task
47+
task: Task "build" is up to date
48+
task: [run] ./try-golang -onetime
49+
50+
ENTER EXAMPLE NAME: syncs_use_oncevalues
51+
52+
[Name] "syncs_use_oncevalues"
53+
[before] 0
54+
[done] result=1 err=<nil> goroutine-15
55+
[done] result=1 err=<nil> goroutine-13
56+
[done] result=1 err=<nil> goroutine-14
57+
[done] result=1 err=<nil> goroutine-10
58+
[done] result=1 err=<nil> goroutine-1
59+
[done] result=1 err=<nil> goroutine-0
60+
[done] result=1 err=<nil> goroutine-2
61+
[done] result=1 err=<nil> goroutine-6
62+
[done] result=1 err=<nil> goroutine-5
63+
[done] result=1 err=<nil> goroutine-11
64+
[done] result=1 err=<nil> goroutine-3
65+
[done] result=1 err=<nil> goroutine-8
66+
[done] result=1 err=<nil> goroutine-9
67+
[done] result=1 err=<nil> goroutine-7
68+
[done] result=1 err=<nil> goroutine-4
69+
[done] result=1 err=<nil> goroutine-12
70+
[after] 1
71+
72+
73+
[Elapsed] 460.969µs
74+
*/
75+
}

0 commit comments

Comments
 (0)