github.com/yaoapp/kun@v0.9.0/any/sync.go (about)

     1  package any
     2  
     3  import (
     4  	"fmt"
     5  	"reflect"
     6  	"sync/atomic"
     7  )
     8  
     9  // Sync the replacement for concurrent safe interface
    10  type Sync struct {
    11  	value *atomic.Value
    12  }
    13  
    14  // MakeSync create a empty instance
    15  func MakeSync() *Sync {
    16  	return &Sync{
    17  		value: &atomic.Value{},
    18  	}
    19  }
    20  
    21  // SyncOf create a new instance
    22  func SyncOf(value interface{}) *Sync {
    23  	v := MakeSync()
    24  	v.value.Store(value)
    25  	return v
    26  }
    27  
    28  // Set set <value> to <v>, and returns the old value.
    29  func (v *Sync) Set(value interface{}) (old interface{}) {
    30  	old = v.Get()
    31  	if reflect.TypeOf(old) != reflect.TypeOf(value) {
    32  		*v = *SyncOf(value)
    33  		return old
    34  	}
    35  	v.value.Store(value)
    36  	return old
    37  }
    38  
    39  // Get returns the current value of <v>.
    40  func (v *Sync) Get() interface{} {
    41  	return v.value.Load()
    42  }
    43  
    44  // Val is alias of Get.
    45  func (v *Sync) Val() interface{} {
    46  	return v.Get()
    47  }
    48  
    49  // Interface is alias of Get.
    50  func (v *Sync) Interface() interface{} {
    51  	return v.Get()
    52  }
    53  
    54  // String returns <v> as string.
    55  func (v *Sync) String() string {
    56  	val := v.value.Load()
    57  	if val == nil {
    58  		return ""
    59  	}
    60  	value, ok := val.(string)
    61  	if !ok {
    62  		panic("v is not a type of string")
    63  	}
    64  	return value
    65  }
    66  
    67  // CString converts and returns <v> as string.
    68  func (v *Sync) CString() string {
    69  	val := v.value.Load()
    70  	value, ok := val.(string)
    71  	if ok {
    72  		return value
    73  	}
    74  	return fmt.Sprintf("%v", val)
    75  }