import "once"
このパッケージで唯一提供されているDo関数は、必ず一度だけ指定した関数を実行します。
通常、初期化処理として使用します。
パッケージファイル
once.go
Do関数
func Do(f func())
このDo関数だけが唯一、このパッケージ内でエキスポートされています。
一度だけ実行する初期化処理(init関数では呼び出さない)を関数に記述しておき、それをパラメータとしてDo関数を呼び出します。
Do(f)
複数のプロセスから同一のfパラメータを使って同時にDo(f)を呼び出したときも、f関数は一度だけ呼び出されます。
f関数から復帰するまでは、他のDo関数の呼び出しはブロックされます。
ただし、通常func()式は評価されるたびに異なる値が返されるため、func()式をDo関数に渡すのは間違ったやり方です。
下はその例です。
func f(x int) {
Do(func() { fmt.Println(x) })
}
これは、下と同じことです。
func f(x int) {
fmt.Println(x)
}
最初のコードではf関数が実行される都度、func()式によって新しい関数が作られます。
そのためその作られた関数すべてが一回ずつ動作してしまいます。
Trackback URL
Leave a comment
Comments