Go 小技巧:巧用空结构体节省内存
在 Go 语言中,struct{} 不包含任何字段,大小为零。这个特性在特定场景下能有效节省内存。
1. 实现 Set 集合
Go 没有内置 Set,通常用 map[Type]struct{} 模拟,比用 map[Type]bool 更省内存:
set := make(map[string]struct{
})
set["key1"] = struct{
}{
}
_, ok := set["key1"] // 检查存在性
2. 通知型 Channel
当我们只需要“信号”而不需要传递数据时,用 chan struct{}:
done := make(chan struct{
})
go func() {
// 执行任务
close(done) // 关闭即发送通知
}()
<-done // 等待完成
3. 控制结构占位
在需要占位但无实际意义的地方使用,比如某些方法的接收者:
type worker struct{
}
func (worker) doWork() {
... }
4. 性能对比
map[string]bool 的 value 占用 1 字节,而 struct{} 占用 0 字节。当 map 元素达到百万级别时,能节省约 1MB 内存,对 GC 也更友好。
注意
空结构体在栈上可能不分配内存,但在逃逸到堆后,多个变量可能共享同一块内存地址。使用时需注意语义清晰,避免过度优化。