并发安全基本类型。
使用场景
gtype使用得非常频繁,任何需要并发安全的场景下都适用。
在普通的并发安全场景中,一个基本类型的变量,特别是一个struct含有若干的属性,往往使用互斥(读写)锁或者多把(读写)锁来进行安全管理。 但这样的使用中,变量/struct/属性的操作性能十分低下,且由于互斥锁机制的存在往往使得操作变得相当复杂,必须小心翼翼地维护好变量/属性的并发安全控制(特别是(RW)Mutex)。
gtype针对于最常用的基本数据类型,提供了对应的并发安全数据类型,便于在并发安全场景下更好地维护变量/属性,开发者无需在struct中再创建和维护繁琐的(RW)Mutex。由于gtype维护的是基本类型的并发安全,因此内部基本都使用了atomic原子操作来维护并发安全性,因此效率往往会比(RW)Mutex互斥锁高出数十倍。
使用方式

  1. import "github.com/gogf/gf/container/gtype"

接口文档
https://godoc.org/github.com/gogf/gf/container/gtype

使用示例

gtype并发安全基本类型的使用非常简单,往往就类似以下几个方法(以gtype.Int类型举例)

  1. func NewInt(value ...int) *Int
  2. func (v *Int) Add(delta int) (new int)
  3. func (v *Int) Cas(old, new int) bool
  4. func (v *Int) Clone() *Int
  5. func (v *Int) Set(value int) (old int)
  6. func (v *Int) String() string
  7. func (v *Int) Val() int

示例1,基本使用

  1. package main
  2. import (
  3. "github.com/gogf/gf/container/gtype"
  4. "fmt"
  5. )
  6. func main() {
  7. // 创建一个Int型的并发安全基本类型对象
  8. i := gtype.NewInt()
  9. // 设置值
  10. fmt.Println(i.Set(10))
  11. // 获取值
  12. fmt.Println(i.Val())
  13. // 数值-1,并返回修改之后的数值
  14. fmt.Println(i.Add(-1))
  15. }

执行后,输出结果为:

  1. 0
  2. 10
  3. 9

示例2,JSON序列化/反序列

gtype模块下的所有容器类型均实现了标准库json数据格式的序列化/反序列化接口。
1、Marshal

  1. package main
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "github.com/gogf/gf/container/gtype"
  6. )
  7. func main() {
  8. type Student struct {
  9. Id *gtype.Int
  10. Name *gtype.String
  11. Scores *gtype.Interface
  12. }
  13. s := Student{
  14. Id: gtype.NewInt(1),
  15. Name: gtype.NewString("john"),
  16. Scores: gtype.NewInterface([]int{100, 99, 98}),
  17. }
  18. b, _ := json.Marshal(s)
  19. fmt.Println(string(b))
  20. }

执行后,输出结果:

  1. {"Id":1,"Name":"john","Scores":[100,99,98]}

2、Unmarshal

  1. package main
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "github.com/gogf/gf/container/gtype"
  6. )
  7. func main() {
  8. b := []byte(`{"Id":1,"Name":"john","Scores":[100,99,98]}`)
  9. type Student struct {
  10. Id *gtype.Int
  11. Name *gtype.String
  12. Scores *gtype.Interface
  13. }
  14. s := Student{}
  15. json.Unmarshal(b, &s)
  16. fmt.Println(s)
  17. }

执行后,输出结果:

  1. {1 john [100,99,98]}