golang通用安全有序映射集合插件库goradd/maps的使用
golang通用安全有序映射集合插件库goradd/maps的使用
goradd/maps是一个使用Go泛型的库,提供了操作不同类型映射的标准接口。使用相同的接口,您可以创建和使用标准Go映射、并发安全的映射和/或允许您按顺序排列映射键的映射。
主要特性
- 提供标准Map接口
- 支持并发安全的SafeMap
- 支持有序的SliceMap和SafeSliceMap
- 包含Set类用于快速判断组成员关系
示例代码
下面是一个完整的使用示例:
package main
import . "github.com/goradd/maps"
import "fmt"
type myMap = Map[string,int] // 这里的等号很关键!
type myStdMap = StdMap[string, int]
func main() {
m := new(Map[string, int])
m.Copy(myStdMap{"b":2, "c":3}) // 从标准map复制数据
m.Set("a",1) // 设置新值
sum := 0
for v := range m.All() { // 遍历所有值
sum += v
}
fmt.Print(sum) // 输出6 (2+3+1)
}
不同类型映射的使用
只需简单地将myMap类型更改为SafeMap,就可以使映射并发安全:
type myMap = SafeMap[string,int] // 并发安全映射
或者更改为SliceMap或SafeSliceMap,以便能够按照创建顺序迭代映射:
type myMap = SliceMap[string,int] // 有序映射
type myMap = SafeSliceMap[string,int] // 并发安全的有序映射
Set使用示例
package main
import . "github.com/goradd/maps"
import "fmt"
func main() {
s := NewSet[string]()
s.Add("a")
s.Add("b")
s.Add("c")
fmt.Println(s.Has("a")) // true
fmt.Println(s.Has("d")) // false
for v := range s.All() {
fmt.Println(v) // 输出a, b, c
}
}
goradd/maps库提供了灵活且类型安全的映射操作方式,可以根据需要选择不同的实现,而无需更改业务逻辑代码。
更多关于golang通用安全有序映射集合插件库goradd/maps的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang通用安全有序映射集合插件库goradd/maps的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
goradd/maps - Go语言安全有序映射集合库
goradd/maps 是一个Go语言的通用安全有序映射集合插件库,提供了线程安全的、有序的映射数据结构实现。下面我将详细介绍它的主要功能和使用方法。
主要特性
- 线程安全:所有操作都是并发安全的
- 有序映射:保持元素的插入顺序或自定义顺序
- 多种映射类型:提供多种映射实现
- 简单易用:API设计简洁明了
安装
go get github.com/goradd/maps
基本使用示例
1. 基本有序映射
package main
import (
"fmt"
"github.com/goradd/maps/ordered"
)
func main() {
// 创建一个新的有序映射
m := ordered.NewMap[string, int]()
// 添加元素
m.Set("one", 1)
m.Set("two", 2)
m.Set("three", 3)
// 获取元素
if val, ok := m.Get("two"); ok {
fmt.Println("two:", val) // 输出: two: 2
}
// 遍历元素(按插入顺序)
m.Range(func(key string, value int) bool {
fmt.Printf("%s: %d\n", key, value)
return true // 继续遍历
})
// 输出顺序: one, two, three
// 删除元素
m.Delete("two")
// 长度
fmt.Println("Length:", m.Len()) // 输出: 2
}
2. 线程安全的有序映射
package main
import (
"fmt"
"sync"
"github.com/goradd/maps/safe"
)
func main() {
// 创建线程安全的有序映射
m := safe.NewOrderedMap[string, int]()
var wg sync.WaitGroup
// 并发写入
for i := 0; i < 10; i++ {
wg.Add(1)
go func(i int) {
defer wg.Done()
key := fmt.Sprintf("key%d", i)
m.Set(key, i)
}(i)
}
wg.Wait()
// 并发读取
m.Range(func(key string, value int) bool {
fmt.Printf("%s: %d\n", key, value)
return true
})
fmt.Println("Total items:", m.Len()) // 输出: 10
}
3. 带排序功能的映射
package main
import (
"fmt"
"github.com/goradd/maps/sorted"
)
func main() {
// 创建按值排序的映射
m := sorted.NewMap[string, int](func(a, b int) bool {
return a < b // 升序排序
})
m.Set("a", 3)
m.Set("b", 1)
m.Set("c", 2)
// 按值排序输出
m.Range(func(key string, value int) bool {
fmt.Printf("%s: %d\n", key, value)
return true
})
// 输出顺序: b:1, c:2, a:3
}
高级功能
1. 自定义比较器
package main
import (
"fmt"
"github.com/goradd/maps/sorted"
)
type Person struct {
Name string
Age int
}
func main() {
// 创建自定义排序的映射
people := sorted.NewMap[string, Person](func(a, b Person) bool {
// 先按年龄升序,年龄相同按姓名升序
if a.Age != b.Age {
return a.Age < b.Age
}
return a.Name < b.Name
})
people.Set("p1", Person{"Alice", 30})
people.Set("p2", Person{"Bob", 25})
people.Set("p3", Person{"Charlie", 30})
people.Range(func(key string, value Person) bool {
fmt.Printf("%s: %+v\n", key, value)
return true
})
// 输出顺序: Bob, Alice, Charlie
}
2. 合并映射
package main
import (
"fmt"
"github.com/goradd/maps/ordered"
)
func main() {
m1 := ordered.NewMap[string, int]()
m1.Set("a", 1)
m1.Set("b", 2)
m2 := ordered.NewMap[string, int]()
m2.Set("c", 3)
m2.Set("d", 4)
// 合并两个映射
m1.Merge(m2)
m1.Range(func(key string, value int) bool {
fmt.Printf("%s: %d\n", key, value)
return true
})
// 输出: a:1, b:2, c:3, d:4
}
性能考虑
- 对于不需要线程安全的场景,可以使用
ordered
包以获得更好的性能 - 高并发场景下使用
safe
包提供的线程安全实现 - 需要排序功能时使用
sorted
包,但要注意排序会带来额外的性能开销
总结
goradd/maps 提供了多种映射实现,可以满足不同场景下的需求:
ordered
:基本有序映射,非线程安全但性能更好safe
:线程安全的有序映射,适合并发环境sorted
:可自定义排序规则的映射
这个库非常适合需要保持元素顺序或需要线程安全映射的场景,API设计简洁,易于集成到现有项目中。
更多高级用法和详细文档可以参考项目的GitHub页面:https://github.com/goradd/maps