Go Once: Difference between revisions
Jump to navigation
Jump to search
(→Do()) |
|||
Line 22: | Line 22: | ||
=Methods= | =Methods= | ||
==<tt>Do()</tt>== | ==<tt>Do()</tt>== | ||
The only argument of <code>Do()</code> is a function value, not a function invocation. <code>Do()</code> will use the function value to invoke the function, internally. | The only argument of <code>Do()</code> is a function value, not a function invocation. <code>Do()</code> will use the function value to invoke the function, internally. All invokers will block, except one, which executes synchronously in the same goroutine that performed the <code>Do()</code> invocation. The blocked invokers will be released after the one that does initialization finishes executing, and none of them will execute. | ||
All invokers will block, except one, |
Revision as of 23:11, 16 January 2024
Internal
Overview
Once
is a Go synchronization construct that is used when a piece of code must be executed only once. This is a useful idiom in initialization. Note that the code is executed synchronously, when it is executed: the invocation to Once#Do()
executes in the same goroutine that makes the Once#Do()
invocation.
Example
var log Log
var initLogOnce sync.Once
...
func GetLog() {
initLogOnce.Do(func() {
log = ... // init the log
})
return log // because the function passed to Do() executes synchronously, log will be initialized here.
}
Methods
Do()
The only argument of Do()
is a function value, not a function invocation. Do()
will use the function value to invoke the function, internally. All invokers will block, except one, which executes synchronously in the same goroutine that performed the Do()
invocation. The blocked invokers will be released after the one that does initialization finishes executing, and none of them will execute.