Versions Compared
compared with
Key
- This line was added.
- This line was removed.
- Formatting was changed.
基本介绍
并发安全基本类型。
使用场景:
gtype
使用得非常频繁,任何需要并发安全的场景下都适用。
在普通的并发安全场景中,一个基本类型的变量,特别是一个struct
含有若干的属性,往往使用互斥(读写)锁或者多把(读写)锁来进行安全管理。 但这样的使用中,变量/struct/属性
的操作性能十分低下,且由于互斥锁机制的存在往往使得操作变得相当复杂,必须小心翼翼地维护好变量/属性
的并发安全控制(特别是(RW)Mutex
)。
gtype
针对于最常用的基本数据类型,提供了对应的并发安全数据类型,便于在并发安全场景下更好地维护变量/属性,开发者无需在struct
中再创建和维护繁琐的(RW)Mutex
。由于gtype
维护的是基本类型的并发安全,因此内部基本都使用了atomic
原子操作来维护并发安全性,因此效率往往会比(RW)Mutex
互斥锁高出数十倍。
使用方式:
Code Block | ||
---|---|---|
| ||
import "github.com/gogf/gf/v2/container/gtype" |
接口文档:
https://godocpkg.org/github.com/gogf/gf/container/gtype
使用示例
gtype
并发安全基本类型的使用非常简单,往往就类似以下几个方法(以gtype.Int
类型举例):
func NewInt(value ...int) *Int
func (v *Int) Add(delta int) (new int)
func (v *Int) Cas(old, new int) bool
func (v *Int) Clone() *Int
func (v *Int) Set(value int) (old int)
func (v *Int) String() string
func (v *Int) Val() int
示例1,基本使用
package main import ( "container/gtype" "fmt" ) func main() { // 创建一个Int型的并发安全基本类型对象 i := gtype.NewInt() // 设置值 fmt.Println(i.Set(10)) // 获取值 fmt.Println(i.Val()) // 数值-1,并返回修改之后的数值 fmt.Println(i.Add(-1)) }执行后,输出结果为:
0
10
9
示例2,JSON
序列化/反序列
gtype
模块下的所有容器类型均实现了标准库json
数据格式的序列化/反序列化接口。
1、Marshal
Code Block | ||
---|---|---|
| ||
package main
import (
"encoding/json"
"fmt"
"github.com/gogf/gf/container/gtype"
)
func main() {
type Student struct {
Id *gtype.Int
Name *gtype.String
Scores *gtype.Interface
}
s := Student{
Id: gtype.NewInt(1),
Name: gtype.NewString("john"),
Scores: gtype.NewInterface([]int{100, 99, 98}),
}
b, _ := json.Marshal(s)
fmt.Println(string(b))
} |
执行后,输出结果:
Code Block | ||
---|---|---|
| ||
{"Id":1,"Name":"john","Scores":[100,99,98]} |
2、Unmarshal
Code Block | ||
---|---|---|
| ||
package main
import (
"encoding/json"
"fmt"
"github.com/gogf/gf/container/gtype"
)
func main() {
b := []byte(`{"Id":1,"Name":"john","Scores":[100,99,98]}`)
type Student struct {
Id *gtype.Int
Name *gtype.String
Scores *gtype.Interface
}
s := Student{}
json.Unmarshal(b, &s)
fmt.Println(s)
} |
执行后,输出结果:
Code Block | ||
---|---|---|
| ||
{1 john [100,99,98]} |
性能测试
基准测试结果如下:
language | xml |
---|
相关文档
Children Display | ||||
---|---|---|---|---|
|
Panel | ||
---|---|---|
| ||
|