gvar 包提供了一个通用的变量类型实现,称为 Var
。这个类型可以存储任意类型的值,并提供了并发安全的操作选项。本手册将详细介绍 gvar 包的使用方法、主要功能和注意事项。
type Var struct {
value interface{} // 底层值
safe bool // 是否并发安全
}
Var
结构体包含两个字段:
value
:存储实际的值,类型为interface{}
,可以存储任意类型的数据。safe
:布尔值,表示是否启用并发安全模式。
使用 New
函数创建新的 Var
实例:
func New(value interface{}, safe ...bool) *Var
示例:
// 创建一个非并发安全的 Var
v1 := gvar.New(42)
// 创建一个并发安全的 Var
v2 := gvar.New("hello", true)
Set
方法用于设置 Var
的值,并返回旧值。
func (v *Var) Set(value interface{}) (old interface{})
示例:
v := gvar.New(10, true)
oldValue := v.Set(20)
fmt.Printf("旧值:%v,新值:%v\n", oldValue, v.Val())
Val
方法返回 Var
的当前值。
func (v *Var) Val() interface{}
示例:
v := gvar.New("hello")
value := v.Val()
fmt.Printf("当前值:%v\n", value)
Int
方法将 Var
的值转换为 int 类型。
func (v *Var) Int() int
示例:
v := gvar.New(42)
intValue := v.Int()
fmt.Printf("整数值:%d\n", intValue)
当创建 Var
实例时,可以指定是否启用并发安全模式。在并发安全模式下,所有的操作都会使用原子操作来确保线程安全。
示例:
v := gvar.New(0, true) // 创建并发安全的 Var
var wg sync.WaitGroup
n := 1000
wg.Add(n)
for i := 0; i < n; i++ {
go func() {
defer wg.Done()
current := v.Int()
v.Set(current + 1)
}()
}
wg.Wait()
fmt.Printf("最终结果:%d\n", v.Int())
gvar 包提供了多种类型转换方法,使得 Var
可以方便地转换为多种基本类型。
Bool()
:转换为 bool 类型Int()
:转换为 int 类型Int8()
:转换为 int8 类型Int16()
:转换为 int16 类型Int32()
:转换为 int32 类型Int64()
:转换为 int64 类型Uint()
:转换为 uint 类型Uint8()
:转换为 uint8 类型Uint16()
:转换为 uint16 类型Uint32()
:转换为 uint32 类型Uint64()
:转换为 uint64 类型Float32()
:转换为 float32 类型Float64()
:转换为 float64 类型
示例:
v := gvar.New("42")
fmt.Printf("Int: %d\n", v.Int())
fmt.Printf("Float64: %f\n", v.Float64())
fmt.Printf("Bool: %v\n", v.Bool())
Time()
:转换为 time.Time 类型Duration()
:转换为 time.Duration 类型
示例:
v1 := gvar.New("2023-05-01 15:30:00")
fmt.Printf("Time: %v\n", v1.Time())
v2 := gvar.New("1h30m")
fmt.Printf("Duration: %v\n", v2.Duration())
Var
类型实现了 json.Marshaler
和 json.Unmarshaler
接口,可以方便地进行 JSON 序列化和反序列化。
示例:
v := gvar.New(map[string]interface{}{"name": "Alice", "age": 30})
// 序列化
jsonData, _ := json.Marshal(v)
fmt.Printf("JSON: %s\n", jsonData)
// 反序列化
var newVar gvar.Var
json.Unmarshal(jsonData, &newVar)
fmt.Printf("反序列化后的值: %v\n", newVar.Val())
Var
类型支持深拷贝操作,可以创建值的完整副本。
func (v *Var) DeepCopy() interface{}
示例:
original := gvar.New([]int{1, 2, 3})
copied := original.DeepCopy().(*gvar.Var)
// 修改原始值
originalSlice := original.Val().([]int)
originalSlice[0] = 100
fmt.Printf("Original: %v\n", original.Val())
fmt.Printf("Copied: %v\n", copied.Val())
- 在并发环境中,务必使用并发安全模式创建
Var
实例。 - 类型转换方法(如
Int()
,Float64()
等)在无法转换时会返回零值,使用时需要注意。 - 使用
DeepCopy()
方法时,需要根据实际存储的值类型进行相应的类型断言。 - 在性能敏感的场景中,可以考虑使用非并发安全模式,但需要自行确保线程安全。
- 由于移除了 Add 方法,在需要进行累加操作时,需要使用 Set 方法配合当前值来实现,这在高并发情况下可能不够准确。
gvar 包提供了一个灵活、强大的通用变量类型实现。通过本手册的介绍,您应该能够在项目中有效地使用 gvar 包。如果遇到任何问题或需要进一步的帮助,请随时查阅源代码或寻求支持。