空结构体
在 Go 语言中,空结构体(struct{}
)是一种特殊的数据类型,它不占用任何内存空间。
1package main
2
3import (
4 "fmt"
5 "unsafe"
6)
7
8func main() {
9 fmt.Println(unsafe.Sizeof(struct{}{})) // 0
10}
使用场景
作为信号或事件通道
用于 Goroutine 间的轻量级通知,不传递实际数据:
1done := make(chan struct{})
2go func() {
3 time.Sleep(1 * time.Second)
4 close(done) // 发送信号
5}()
6<-done // 阻塞等待信号
实现集合(Set)
利用 map
的键唯一性,值用空结构体节省内存:
1set := make(map[string]struct{})
2set["foo"] = struct{}{}
3if _, exists := set["foo"]; exists {
4 fmt.Println("存在")
5}
方法接收器(无状态方法)
当方法不需要访问结构体字段时:
1type Noop struct{}
2func (Noop) DoSomething() { fmt.Println("操作完成") }
3
4var n Noop
5n.DoSomething()
与 interface{}
的区别
特性 | struct{} | interface{} |
---|---|---|
内存占用 | 0 字节 | 16 字节(64位系统) |
用途 | 无数据占位 | 任意类型容器 |
类型安全 | 是 | 需要类型断言 |
高级用法
作为同步原语
替代 sync.Mutex
的轻量级锁(需结合通道):
1var lock = make(chan struct{}, 1)
2lock <- struct{}{} // 加锁
3<-lock // 解锁
优化内存布局
在结构体中作为填充字段,避免内存对齐浪费:
1type Data struct {
2 Flag bool
3 _ struct{} // 防止后续字段因对齐产生内存间隙
4 Value int64
5}