Once is an object that will perform exactly one action. Unlike sync.Once, this Once allowes the action to have return values.
type Once struct {
// contains filtered or unexported fields
}
func NewOnce() *Once
NewOnce creates a new Once instance.
func (o *Once) Do(ctx context.Context, f func() (interface{}, error)) (bool, interface{}, error)
Do calls the function f if and only if Do is being called first time or all previous function calls are cancelled, deadline exceeded, or panicking. When `once.Do(ctx, f)` is called multiple times, the return value of the first call of the function f is stored, and is directly returned for other calls. Besides the return value of the function f, including the error, Do returns true if the function f passed is called first and is not cancelled, deadline exceeded, or panicking. Otherwise, returns false.