github.com/wangyougui/gf/v2@v2.6.5/container/gvar/gvar.go (about) 1 // Copyright GoFrame Author(https://goframe.org). All Rights Reserved. 2 // 3 // This Source Code Form is subject to the terms of the MIT License. 4 // If a copy of the MIT was not distributed with this file, 5 // You can obtain one at https://github.com/wangyougui/gf. 6 7 // Package gvar provides an universal variable type, like generics. 8 package gvar 9 10 import ( 11 "time" 12 13 "github.com/wangyougui/gf/v2/container/gtype" 14 "github.com/wangyougui/gf/v2/internal/deepcopy" 15 "github.com/wangyougui/gf/v2/internal/json" 16 "github.com/wangyougui/gf/v2/os/gtime" 17 "github.com/wangyougui/gf/v2/util/gconv" 18 "github.com/wangyougui/gf/v2/util/gutil" 19 ) 20 21 // Var is an universal variable type implementer. 22 type Var struct { 23 value interface{} // Underlying value. 24 safe bool // Concurrent safe or not. 25 } 26 27 // New creates and returns a new Var with given `value`. 28 // The optional parameter `safe` specifies whether Var is used in concurrent-safety, 29 // which is false in default. 30 func New(value interface{}, safe ...bool) *Var { 31 if len(safe) > 0 && safe[0] { 32 return &Var{ 33 value: gtype.NewInterface(value), 34 safe: true, 35 } 36 } 37 return &Var{ 38 value: value, 39 } 40 } 41 42 // Copy does a deep copy of current Var and returns a pointer to this Var. 43 func (v *Var) Copy() *Var { 44 return New(gutil.Copy(v.Val()), v.safe) 45 } 46 47 // Clone does a shallow copy of current Var and returns a pointer to this Var. 48 func (v *Var) Clone() *Var { 49 return New(v.Val(), v.safe) 50 } 51 52 // Set sets `value` to `v`, and returns the old value. 53 func (v *Var) Set(value interface{}) (old interface{}) { 54 if v.safe { 55 if t, ok := v.value.(*gtype.Interface); ok { 56 old = t.Set(value) 57 return 58 } 59 } 60 old = v.value 61 v.value = value 62 return 63 } 64 65 // Val returns the current value of `v`. 66 func (v *Var) Val() interface{} { 67 if v == nil { 68 return nil 69 } 70 if v.safe { 71 if t, ok := v.value.(*gtype.Interface); ok { 72 return t.Val() 73 } 74 } 75 return v.value 76 } 77 78 // Interface is alias of Val. 79 func (v *Var) Interface() interface{} { 80 return v.Val() 81 } 82 83 // Bytes converts and returns `v` as []byte. 84 func (v *Var) Bytes() []byte { 85 return gconv.Bytes(v.Val()) 86 } 87 88 // String converts and returns `v` as string. 89 func (v *Var) String() string { 90 return gconv.String(v.Val()) 91 } 92 93 // Bool converts and returns `v` as bool. 94 func (v *Var) Bool() bool { 95 return gconv.Bool(v.Val()) 96 } 97 98 // Int converts and returns `v` as int. 99 func (v *Var) Int() int { 100 return gconv.Int(v.Val()) 101 } 102 103 // Int8 converts and returns `v` as int8. 104 func (v *Var) Int8() int8 { 105 return gconv.Int8(v.Val()) 106 } 107 108 // Int16 converts and returns `v` as int16. 109 func (v *Var) Int16() int16 { 110 return gconv.Int16(v.Val()) 111 } 112 113 // Int32 converts and returns `v` as int32. 114 func (v *Var) Int32() int32 { 115 return gconv.Int32(v.Val()) 116 } 117 118 // Int64 converts and returns `v` as int64. 119 func (v *Var) Int64() int64 { 120 return gconv.Int64(v.Val()) 121 } 122 123 // Uint converts and returns `v` as uint. 124 func (v *Var) Uint() uint { 125 return gconv.Uint(v.Val()) 126 } 127 128 // Uint8 converts and returns `v` as uint8. 129 func (v *Var) Uint8() uint8 { 130 return gconv.Uint8(v.Val()) 131 } 132 133 // Uint16 converts and returns `v` as uint16. 134 func (v *Var) Uint16() uint16 { 135 return gconv.Uint16(v.Val()) 136 } 137 138 // Uint32 converts and returns `v` as uint32. 139 func (v *Var) Uint32() uint32 { 140 return gconv.Uint32(v.Val()) 141 } 142 143 // Uint64 converts and returns `v` as uint64. 144 func (v *Var) Uint64() uint64 { 145 return gconv.Uint64(v.Val()) 146 } 147 148 // Float32 converts and returns `v` as float32. 149 func (v *Var) Float32() float32 { 150 return gconv.Float32(v.Val()) 151 } 152 153 // Float64 converts and returns `v` as float64. 154 func (v *Var) Float64() float64 { 155 return gconv.Float64(v.Val()) 156 } 157 158 // Time converts and returns `v` as time.Time. 159 // The parameter `format` specifies the format of the time string using gtime, 160 // eg: Y-m-d H:i:s. 161 func (v *Var) Time(format ...string) time.Time { 162 return gconv.Time(v.Val(), format...) 163 } 164 165 // Duration converts and returns `v` as time.Duration. 166 // If value of `v` is string, then it uses time.ParseDuration for conversion. 167 func (v *Var) Duration() time.Duration { 168 return gconv.Duration(v.Val()) 169 } 170 171 // GTime converts and returns `v` as *gtime.Time. 172 // The parameter `format` specifies the format of the time string using gtime, 173 // eg: Y-m-d H:i:s. 174 func (v *Var) GTime(format ...string) *gtime.Time { 175 return gconv.GTime(v.Val(), format...) 176 } 177 178 // MarshalJSON implements the interface MarshalJSON for json.Marshal. 179 func (v Var) MarshalJSON() ([]byte, error) { 180 return json.Marshal(v.Val()) 181 } 182 183 // UnmarshalJSON implements the interface UnmarshalJSON for json.Unmarshal. 184 func (v *Var) UnmarshalJSON(b []byte) error { 185 var i interface{} 186 if err := json.UnmarshalUseNumber(b, &i); err != nil { 187 return err 188 } 189 v.Set(i) 190 return nil 191 } 192 193 // UnmarshalValue is an interface implement which sets any type of value for Var. 194 func (v *Var) UnmarshalValue(value interface{}) error { 195 v.Set(value) 196 return nil 197 } 198 199 // DeepCopy implements interface for deep copy of current type. 200 func (v *Var) DeepCopy() interface{} { 201 if v == nil { 202 return nil 203 } 204 return New(deepcopy.Copy(v.Val()), v.safe) 205 }