Go语言技巧:巧用空结构体
Go语言中有一个非常实用的特性——空结构体。定义方式为 struct{},它不占用任何内存空间(unsafe.Sizeof 返回0)。
主要应用场景
1. 实现集合(Set)
Go没有内置的set类型,但可以用map配合空结构体实现:
type Set map[string]struct{
}
func (s Set) Add(key string) {
s[key] = struct{
}{
}
}
func (s Set) Exists(key string) bool {
_, ok := s[key]
return ok
}
利用空结构体零内存的特点,比使用 map[string]bool 更节省内存。
2. 通道信号
当只需要通知而不需要传递数据时:
done := make(chan struct{
})
go func() {
// 执行任务
close(done) // 发送完成信号
}()
<-done // 等待完成
这种方式比使用 chan bool 更清晰地表达"仅通知"的意图。
3. 占位符
在结构体中作为占位符,利用其对齐特性:
type Example struct {
A int
_ struct{
} // 防止未命名字段比较
}
性能优势
由于不分配内存,空结构体在大量使用时能显著减少内存分配,提升GC性能。在实现高性能缓存或信号系统时特别有用。
注意事项
- 空结构体的地址可能相同,但不要依赖此特性
- 在slice中使用不会节省内存(slice header本身占用空间)
合理使用空结构体,能让你的Go代码更简洁高效!