空结构体

在 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}