strmap

package
v0.34.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 4, 2026 License: MIT Imports: 9 Imported by: 0

Documentation

Overview

Package strmap GC 友好的只读字符串 map:键打包进单一 []byte、int32 开放寻址 哈希表,配合 maphash 种子哈希,避免为海量静态映射(如 header/路由/字典表) 长期持有海量小字符串对象带来的 GC 扫描开销。

语义约束(按设计取舍):

  • 构建后只读(Load 重建整体替换,无单键增删);
  • **Load 不得与读并发**:重载会就地改写本表的内部缓冲(data / items / hashtable),并发读会看到撕裂的中间态。需要「读旧表、写新表、原子换」, 由调用方构造新表后整体替换指针;
  • 键与值的内存布局为性能而设,值类型 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

View Source
var ErrDuplicateKey = errors.New("strmap: 存在重复键")

ErrDuplicateKey LoadFromSlice 检测到重复键(本实现拒绝重复键以保证 Get 结果确定)。

View Source
var ErrKeyTooLarge = errors.New("strmap: 键过长")

ErrKeyTooLarge 单键超过 uint32 上限(理论边界,正常数据不会触达)。

View Source
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 NewStr2Str

func NewStr2Str() *Str2Str

NewStr2Str 创建空的 Str2Str。

func NewStr2StrFromMap

func NewStr2StrFromMap(m map[string]string) *Str2Str

NewStr2StrFromMap 从 map 构建并返回;构建失败 panic。

func NewStr2StrFromSlice

func NewStr2StrFromSlice(kk, vv []string) *Str2Str

NewStr2StrFromSlice 从等长键值切片构建并返回;构建失败 panic。

func (*Str2Str) Get

func (sm *Str2Str) Get(k string) (string, bool)

Get 查找键;未构建(空表)返回 "" + false。

func (*Str2Str) Len

func (sm *Str2Str) Len() int

Len 返回条目数。

func (*Str2Str) LoadFromMap

func (sm *Str2Str) LoadFromMap(m map[string]string) error

LoadFromMap 重置并从 map 加载。

func (*Str2Str) LoadFromSlice

func (sm *Str2Str) LoadFromSlice(kk, vv []string) error

LoadFromSlice 重置并从等长键值切片加载。

type StrMap

type StrMap[V any] struct {
	// contains filtered or unexported fields
}

StrMap 表示 GC 友好的只读字符串 map。 值类型 V 建议不含指针(不含指针时整张表对 GC 是一块标量内存,零扫描开销)。

func New

func New[V any]() *StrMap[V]

New 创建空的 StrMap。

func NewFromMap

func NewFromMap[V any](m map[string]V) *StrMap[V]

NewFromMap 从 map 构建并返回;构建失败(重复键等)panic。 适合包级静态表场景——构建期错误在启动时暴露。

func NewFromSlice

func NewFromSlice[V any](kk []string, vv []V) *StrMap[V]

NewFromSlice 从等长键值切片构建并返回;构建失败 panic。

func (*StrMap[V]) Get

func (m *StrMap[V]) Get(s string) (V, bool)

Get 查找键;表未构建(空表)时返回零值 + false。 哈希冲突时顺位扫描同槽条目,最坏 O(n),实际负载因子 0.75 下近 O(1)。

func (*StrMap[V]) Item

func (m *StrMap[V]) Item(i int) (string, V)

Item 返回第 i 个条目(按内部存储序,非字典序)。 i 越界时 panic(与切片下标语义一致,调用方以 Len 控制范围)。

func (*StrMap[V]) Len

func (m *StrMap[V]) Len() int

Len 返回条目数。

func (*StrMap[V]) LoadFromMap

func (m *StrMap[V]) LoadFromMap(mp map[string]V) error

LoadFromMap 重置并从 map 加载。

func (*StrMap[V]) LoadFromSlice

func (m *StrMap[V]) LoadFromSlice(kk []string, vv []V) error

LoadFromSlice 重置并从等长键值切片加载;检测到重复键返回 ErrDuplicateKey。

func (*StrMap[V]) String

func (m *StrMap[V]) String() string

String 返回调试友好的内容表示(非确定性顺序)。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL