github.com/shuguocloud/go-zero@v1.3.0/core/syncx/onceguard.go (about)

     1  package syncx
     2  
     3  import "sync/atomic"
     4  
     5  // A OnceGuard is used to make sure a resource can be taken once.
     6  type OnceGuard struct {
     7  	done uint32
     8  }
     9  
    10  // Taken checks if the resource is taken.
    11  func (og *OnceGuard) Taken() bool {
    12  	return atomic.LoadUint32(&og.done) == 1
    13  }
    14  
    15  // Take takes the resource, returns true on success, false for otherwise.
    16  func (og *OnceGuard) Take() bool {
    17  	return atomic.CompareAndSwapUint32(&og.done, 0, 1)
    18  }