関連記事
GitHub - devlights/blog-summary: ブログ「いろいろ備忘録日記」のまとめ
概要
以下、自分用のメモです。忘れない内にメモメモ。。。
Go 1.21 から、syncパッケージに OnceValues
って関数が追加されていたのですね。知らなかったです。
https://pkg.go.dev/sync@go1.21.4#OnceValues
元々存在していた sync.Once
が使いやすくなった感じですね。動きとしては同じで1度だけ実行される関数にしてくれます。
サンプル
package syncs import ( "runtime" "sync" "github.com/devlights/gomy/output" ) // UseOnceValues は、Go 1.21 で追加された sync.OnceValues() のサンプルです。 // // # REFERENCES // - https://pkg.go.dev/sync@go1.21.4#OnceValues func UseOnceValues() error { var ( v = 0 f = sync.OnceValues(func() (int, error) { v++ return v, nil }) ) output.Stdoutl("[before]", v) var ( numCpu = runtime.NumCPU() done = make(chan bool, numCpu) ) for i := 0; i < numCpu; i++ { i := i go func() { result, err := f() output.Stderrf("[done]", "result=%d\terr=%v\tgoroutine-%d\n", result, err, i) done <- true }() } for i := 0; i < numCpu; i++ { <-done } output.Stdoutl("[after]", v) return nil /* $ task task: Task "build" is up to date task: [run] ./try-golang -onetime ENTER EXAMPLE NAME: syncs_use_oncevalues [Name] "syncs_use_oncevalues" [before] 0 [done] result=1 err=<nil> goroutine-15 [done] result=1 err=<nil> goroutine-13 [done] result=1 err=<nil> goroutine-14 [done] result=1 err=<nil> goroutine-10 [done] result=1 err=<nil> goroutine-1 [done] result=1 err=<nil> goroutine-0 [done] result=1 err=<nil> goroutine-2 [done] result=1 err=<nil> goroutine-6 [done] result=1 err=<nil> goroutine-5 [done] result=1 err=<nil> goroutine-11 [done] result=1 err=<nil> goroutine-3 [done] result=1 err=<nil> goroutine-8 [done] result=1 err=<nil> goroutine-9 [done] result=1 err=<nil> goroutine-7 [done] result=1 err=<nil> goroutine-4 [done] result=1 err=<nil> goroutine-12 [after] 1 [Elapsed] 460.969µs */ }
実行すると以下のようになります。
$ task task: Task "build" is up to date task: [run] ./try-golang -onetime ENTER EXAMPLE NAME: syncs_use_oncevalues [Name] "syncs_use_oncevalues" [before] 0 [done] result=1 err=<nil> goroutine-15 [done] result=1 err=<nil> goroutine-11 [done] result=1 err=<nil> goroutine-12 [done] result=1 err=<nil> goroutine-4 [done] result=1 err=<nil> goroutine-3 [done] result=1 err=<nil> goroutine-5 [done] result=1 err=<nil> goroutine-13 [done] result=1 err=<nil> goroutine-14 [done] result=1 err=<nil> goroutine-0 [done] result=1 err=<nil> goroutine-6 [done] result=1 err=<nil> goroutine-8 [done] result=1 err=<nil> goroutine-7 [done] result=1 err=<nil> goroutine-1 [done] result=1 err=<nil> goroutine-9 [done] result=1 err=<nil> goroutine-2 [done] result=1 err=<nil> goroutine-10 [after] 1 [Elapsed] 502.8µs
参考情報
sync: add OnceFunc, OnceValue, OnceValues · Issue #56102 · golang/go · GitHub
New functions to support sync.Once | by Pranoy Kundu | Oct, 2023 | Medium
Goのおすすめ書籍
過去の記事については、以下のページからご参照下さい。
サンプルコードは、以下の場所で公開しています。