garray
并发安全数组。支持普通并发安全数组(非排序),以及排序的并发安全数组,并支持数据项唯一性矫正。
使用场景:
当做普通数组用,提供了一系列相关方法可简化slice
的操作。
使用方式:
import "gitee.com/johng/gf/g/container/garray"
方法列表:godoc.org/github.com/johng-cn/gf/g/container/garray
由于garray
模块下的对象及方法较多,支持int
/string
/interface{}
三种数据类型,这里便不一一列举。garray
下包含了多种数据类型的slice,可以使用 garray.New*Array
/garray.NewSorted*Array
方法来创建,其中garray.New*Array
为普通不排序数组,garray.NewSorted*Array
为排序数组(当创建interface{}
类型的数组时,创建时可以指定自定义的排序函数)。
使用示例1,普通数组
package main
import (
"fmt"
"gitee.com/johng/gf/g/container/garray"
)
func main () {
// 创建普通的int类型数组,并关闭默认的并发安全特性
a := garray.NewIntArray(0, 0, false)
// 添加数据项
for i := 0; i < 10; i++ {
a.Append(i)
}
// 获取当前数组长度
fmt.Println(a.Len())
// 获取当前数据项列表
fmt.Println(a.Slice())
// 获取指定索引项
fmt.Println(a.Get(6))
// 在指定索引前插入数据项
a.InsertAfter(9, 11)
// 在指定索引后插入数据项
a.InsertBefore(10, 10)
fmt.Println(a.Slice())
// 修改指定索引的数据项
a.Set(0, 100)
fmt.Println(a.Slice())
// 搜索数据项,返回搜索到的索引位置
fmt.Println(a.Search(5))
// 删除指定索引的数据项
a.Remove(0)
fmt.Println(a.Slice())
// 并发安全,写锁操作
a.LockFunc(func(array []int) {
// 将末尾项改为100
array[len(array) - 1] = 100
})
// 并发安全,读锁操作
a.RLockFunc(func(array []int) {
fmt.Println(array[len(array) - 1])
})
// 清空数组
fmt.Println(a.Slice())
a.Clear()
fmt.Println(a.Slice())
}
执行后,输出结果为:
10
[0 1 2 3 4 5 6 7 8 9]
6
[0 1 2 3 4 5 6 7 8 9 10 11]
[100 1 2 3 4 5 6 7 8 9 10 11]
5
[1 2 3 4 5 6 7 8 9 10 11]
100
[1 2 3 4 5 6 7 8 9 10 100]
[]
使用示例2,排序数组
排序数组的方法与普通数组类似,但是带有排序功能及唯一性过滤功能。
package main
import (
"fmt"
"gitee.com/johng/gf/g/container/garray"
)
func main () {
// 自定义排序数组,降序排序(SortedIntArray管理的数据是升序)
a := garray.NewSortedArray(0, 0, func(v1, v2 interface{}) int {
if v1.(int) < v2.(int) {
return 1
}
if v1.(int) > v2.(int) {
return -1
}
return 0
})
// 添加数据
a.Add(2)
a.Add(3)
a.Add(1)
fmt.Println(a.Slice())
// 添加重复数据
a.Add(3)
fmt.Println(a.Slice())
// 检索数据,返回最后对比的索引位置,检索结果
// 检索结果:0: 匹配; <0:参数小于对比值; >0:参数大于对比值
fmt.Println(a.Search(1))
// 设置不可重复
a.SetUnique(true)
fmt.Println(a.Slice())
a.Add(1)
fmt.Println(a.Slice())
}
执行后,输出结果:
[3 2 1]
[3 3 2 1]
3 0
[3 2 1]
[3 2 1]