# sync 包扩展

我们使用泛型对 sync 包中的一些类型进行了封装。使用泛型的封装相比原来会有额外的性能损耗,目前通过基准测试我们确认,大概会多 3ns 左右的损耗,并且不会引入额外的内存分配。

你需要引入包来使用这些封装后的结构体:

import (
    "github.com/ecodeclub/ekit/syncx"
)
1
2
3

# 泛型 Pool

我们使用泛型了封装了 sync.Pool:

func ExampleNew() {
	p := syncx.NewPool[[]byte](func() []byte {
		res := make([]byte, 1, 12)
		res[0] = 'A'
		return res
	})

	res := p.Get()
	fmt.Print(string(res))
	// Output:
	// A
}
1
2
3
4
5
6
7
8
9
10
11
12

注意这里我们要求 NewPool 里面传入的构造函数,不能为 nil。换言之,在 Pool 里面的所有元素都不能为 nil。

# 泛型 Map

类似地,我们也封装了 sync.Map:

func ExampleMap_Load() {
	var m syncx.Map[string, int]
	m.Store("key1", 123)
	val, ok := m.Load("key1")
	if ok {
		fmt.Println(val)
	}
	// Output:
	// 123
}
1
2
3
4
5
6
7
8
9
10

注意,key 只能是 comparable 类型。