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 }