struct{}{} 是 Go 中最小的内存占用值(0字节)
在 Go 语言中,struct{}{} 确实是一个特殊的值,它具有以下特点:
1. 零内存占用
- 它是空结构体
struct{}的实例,而空结构体不占用任何内存空间(0 字节)。 - 这是因为空结构体没有任何字段需要存储。
2. 用途
- 占位符:常用于不需要存储数据,仅需要逻辑存在的场景(如信号、标记)。
- 实现集合(Set):配合
map使用,因为只关心键而非值:set := make(map[string]struct{}) set["key"] = struct{}{} // 值部分不占用额外内存 - 通道信号:通过
chan struct{}发送无数据的信号:done := make(chan struct{}) go func() { // ... 执行任务 ... done <- struct{}{} // 发送完成信号 }()
3. 唯一性
- 所有
struct{}{}的地址相同(编译器优化),但通常直接使用值而非指针。
4. 对比其他“零值”
- 其他类型的零值(如
int的0)仍会占用对应类型的内存(如int为 8 字节),但struct{}{}真正实现零内存。
示例代码
package main
import (
"fmt"
"unsafe"
)
func main() {
empty := struct{}{}
fmt.Println("Size of empty struct:", unsafe.Sizeof(empty)) // 输出 0
// 作为 map 的值
set := make(map[string]struct{})
set["a"] = struct{}{}
fmt.Println("Set contains 'a':", _, ok := set["a"]) // true
// 通道信号
ch := make(chan struct{})
go func() {
ch <- struct{}{}
}()
<-ch
fmt.Println("Signal received")
}
总结
struct{}{} 是 Go 中一种高效的设计模式,适用于需要零内存开销的场景,尤其在集合和信号传递中非常有用。
Do not communicate by sharing memory; instead, share memory by communicating.

浙公网安备 33010602011771号