Help us shape the future of Go! Take the 2026 Go Developer Survey

strmap

package
v0.25.0 Latest Latest
Warning

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

Go to latest
Published: Oct 24, 2026 License: MIT Imports: 9 Imported by: 0

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

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