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语言的通用安全有序映射集合插件库,提供了线程安全的、有序的映射数据结构实现。下面我将详细介绍它的主要功能和使用方法。

主要特性

  1. 线程安全:所有操作都是并发安全的
  2. 有序映射:保持元素的插入顺序或自定义顺序
  3. 多种映射类型:提供多种映射实现
  4. 简单易用: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
}

性能考虑

  1. 对于不需要线程安全的场景,可以使用 ordered 包以获得更好的性能
  2. 高并发场景下使用 safe 包提供的线程安全实现
  3. 需要排序功能时使用 sorted 包,但要注意排序会带来额外的性能开销

总结

goradd/maps 提供了多种映射实现,可以满足不同场景下的需求:

  • ordered:基本有序映射,非线程安全但性能更好
  • safe:线程安全的有序映射,适合并发环境
  • sorted:可自定义排序规则的映射

这个库非常适合需要保持元素顺序或需要线程安全映射的场景,API设计简洁,易于集成到现有项目中。

更多高级用法和详细文档可以参考项目的GitHub页面:https://github.com/goradd/maps

回到顶部