GoFrame 的 `gmap` 是一个为 Go 语言提供的并发安全的 map 容器模块,它包含多种数据结构的 map 容器,如 `HashMap`、`TreeMap` 和 `ListMap`。以下是 `gmap` 的一些关键特性和使用方法:
### 关键特性
1. **并发安全**:`gmap` 默认支持并发操作,但也提供了选项来关闭并发安全特性,以提升性能或简化操作。
2. **多种数据结构**:提供 `HashMap`(哈希表)、`TreeMap`(红黑树)、`ListMap`(哈希表+双向链表)等,每种结构都有其特定的性能特点和使用场景。
3. **性能优异**:与 Go 语言标准库中的 `sync.Map` 相比,`gmap` 在性能上有更出色的表现,并且功能更为丰富。
4. **有序遍历**:`ListMap` 支持按照写入顺序遍历,而 `TreeMap` 支持键名排序及有序遍历。
5. **丰富接口**:`gmap` 提供了丰富的接口,如 `Set`、`Get`、`Remove`、`Contains`、`Size`、`Keys`、`Values` 等,以及批量操作和迭代器功能。
### 使用方法
以下是 `gmap` 的一些基本操作示例:
```go
import (
"fmt"
"github.com/gogf/gf/v2/container/gmap"
)
func main() {
// 创建一个并发安全的 gmap 实例
m := gmap.New()
// 设置键值对
for i := 0; i < 10; i++ {
m.Set(i, i)
}
// 批量设置键值对
m.Sets(map[interface{}]interface{}{
10: 10,
11: 11,
})
// 查询是否存在特定的键
fmt.Println(m.Contains(1))
// 查询键对应的值
fmt.Println(m.Get(1))
// 删除键值对
m.Remove(9)
// 批量删除键值对
m.Removes([]interface{}{10, 11})
// 获取当前所有键名列表
fmt.Println(m.Keys())
// 获取当前所有键值列表
fmt.Println(m.Values())
// 当键值不存在时,写入给定的默认值
fmt.Println(m.GetOrSet(100, 100))
// 删除键值对,并返回对应的键值
fmt.Println(m.Remove(100))
// 遍历 map
m.Iterator(func(k interface{}, v interface{}) bool {
fmt.Printf("%v:%v ", k, v)
return true
})
// 清空 map
m.Clear()
// 判断 map 是否为空
fmt.Println(m.IsEmpty())
}
```
### 性能测试
`gmap` 在性能上进行了优化,提供了与 Go 原生 `map` 和 `sync.Map` 不同的性能特点。例如,在某些场景下,`gmap` 的 `Set` 和 `Get` 操作在基准测试中表现出更低的延迟和更少的内存分配。
`gmap` 是 GoFrame 框架中众多基础组件之一,它通过提供高效的并发安全数据结构,帮助开发者在处理并发数据时更加得心应手。