Documentation
¶
Overview ¶
Package strmap GC 友好的只读字符串 map:键打包进单一 []byte、int32 开放寻址 哈希表,配合 maphash 种子哈希,避免为海量静态映射(如 header/路由/字典表) 长期持有海量小字符串对象带来的 GC 扫描开销。
语义约束(按设计取舍):
- 构建后只读(Load 重建整体替换,无单键增删);
- 键与值的内存布局为性能而设,值类型 V 建议不含指针(含指针不会错,只是失去 GC 收益);
- Item/Get 返回的键字符串是底层数组的零拷贝视图,StrMap 存活期间保持有效, 不得对其写入(底层只读保证)。
设计参考 cloudwego/gopkg/container/strmap(Apache-2.0),本实现为独立重写 (MIT,oekit/pkg):哈希表定容、打包键、零拷贝视图思路一致;去掉了对 unsafex 的依赖(Go 1.20+ 直接用 unsafe.String/Slice),长度前缀改用 binary.NativeEndian,并在空表 Get、重复键等边界上给出确定性错误。
Index ¶
Constants ¶
This section is empty.
Variables ¶
var ErrDuplicateKey = errors.New("strmap: 存在重复键")
ErrDuplicateKey LoadFromSlice 检测到重复键(本实现拒绝重复键以保证 Get 结果确定)。
var ErrKeyTooLarge = errors.New("strmap: 键过长")
ErrKeyTooLarge 单键超过 uint32 上限(理论边界,正常数据不会触达)。
var ErrKvLenMismatch = errors.New("strmap: kv 长度不一致")
ErrKvLenMismatch LoadFromSlice/LoadFromSlice 的键值长度不一致。
Functions ¶
This section is empty.
Types ¶
type Str2Str ¶
type Str2Str struct {
// contains filtered or unexported fields
}
Str2Str 只读 string→string 映射:值打包进 strStore 连续内存(每条 [u32 长度][字节],不再各持一个字符串对象),键走 StrMap[int]。 适合 header 名→规范名、枚举名→编码等大静态字典。
func NewStr2StrFromMap ¶
NewStr2StrFromMap 从 map 构建并返回;构建失败 panic。
func NewStr2StrFromSlice ¶
NewStr2StrFromSlice 从等长键值切片构建并返回;构建失败 panic。
func (*Str2Str) LoadFromMap ¶
LoadFromMap 重置并从 map 加载。
func (*Str2Str) LoadFromSlice ¶
LoadFromSlice 重置并从等长键值切片加载。
type StrMap ¶
type StrMap[V any] struct { // contains filtered or unexported fields }
StrMap 表示 GC 友好的只读字符串 map。 值类型 V 建议不含指针(不含指针时整张表对 GC 是一块标量内存,零扫描开销)。
func NewFromMap ¶
NewFromMap 从 map 构建并返回;构建失败(重复键等)panic。 适合包级静态表场景——构建期错误在启动时暴露。
func NewFromSlice ¶
NewFromSlice 从等长键值切片构建并返回;构建失败 panic。
func (*StrMap[V]) LoadFromMap ¶
LoadFromMap 重置并从 map 加载。
func (*StrMap[V]) LoadFromSlice ¶
LoadFromSlice 重置并从等长键值切片加载;检测到重复键返回 ErrDuplicateKey。