惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
大猫的无限游戏
大猫的无限游戏
B
Blog
阮一峰的网络日志
阮一峰的网络日志
IT之家
IT之家
Hugging Face - Blog
Hugging Face - Blog
博客园 - 【当耐特】
Jina AI
Jina AI
博客园 - 聂微东
T
The Blog of Author Tim Ferriss
宝玉的分享
宝玉的分享
L
LangChain Blog
M
MIT News - Artificial intelligence
Blog — PlanetScale
Blog — PlanetScale
腾讯CDC
酷 壳 – CoolShell
酷 壳 – CoolShell
Y
Y Combinator Blog
F
Fortinet All Blogs
H
Help Net Security
B
Blog RSS Feed
J
Java Code Geeks
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Apple Machine Learning Research
Apple Machine Learning Research
S
SegmentFault 最新的问题

郑文峰的博客

使用dify对接飞书多维表格 使用n8n对接飞书多维表格 服务启动时出现 OOM 一次服务升级时pg表DDL执行超时失败 Go语言高效IO缓冲技术详解 Go语言延迟初始化(Lazy Initialization)最佳实践 Go语言字符串拼接性能对比与优化指南 Go语言结构体内存对齐完全指南 Go语言堆栈分配与逃逸分析深度解析 Go语言原子操作完全指南 Go语言内存预分配完全指南 Go语言不可变数据共享:无锁并发编程实践 Go语言零拷贝技术完全指南 Go语言遍历性能深度解析:从原理到优化实践 Go语言Interface Boxing原理与性能优化指南 Go协程池深度解析:原理、实现与最佳实践 使用etcd分布式锁导致的协程泄露与死锁问题 基于pre-commit的Python代码规范落地实践 初识 MCP Server pulsar阻塞导致logstash无法接入日志 django-prometheus使用及源码分析 kube-proxy源码分析 kubernetes service如何通过iptables转发 tcp缓存引起的日志丢失 django-apschedule定时任务异常停止 理解calico容器网络通信方案原理 理解flannel的三种容器网络方案原理 理解Linux IPIP隧道 理解VXLAN网络 理解Linux TunTap设备
Go语言空结构体:零内存消耗的高效编程
zhengwenfeng · 2025-06-15 · via 郑文峰的博客

# 1. 前言

空结构体不占用任何内存空间,所有空结构体实例共享相同的内存地址。这种特性使其成为Go语言中实现高效数据结构和并发模式的理想选择。本文将深入探讨空结构体的工作原理及其在高性能编程中的典型应用场景。

# 2. 应用场景

# 2.1 实现 Set 数据结构

Go标准库没有Set类型,但可以用map[T]struct{}高效实现:

type Set map[string]struct{}

// 检查元素是否存在
func (s Set) Has(key string) bool {
	_, ok := s[key]
	return ok
}

// 添加元素
func (s Set) Add(key string) {
	s[key] = struct{}{}
}

// 删除元素
func (s Set) Delete(key string) {
	delete(s, key)
}

func main() {
	s := make(Set)
	s.Add("Tom")
	s.Add("Sam")
	fmt.Println(s.Has("Tom"))   // true
	fmt.Println(s.Has("Jack"))  // false
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

# 2.2 作为channel的信号

空结构体常用于channel通信,表示纯信号通知:

func worker(done chan struct{}) {
    // 模拟工作
    time.Sleep(time.Second)
    
    // 发送完成信号
    done <- struct{}{}
}

func main() {
    done := make(chan struct{})
    go worker(done)
    
    // 等待工作完成
    <-done
    fmt.Println("Work done")
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 2.3 仅包含方法的结构体

当只需要方法不需要存储数据时:

type Logger struct{} // 不需要状态存储

func (l Logger) Info(msg string) {
    fmt.Printf("[INFO] %s\n", msg)
}

func (l Logger) Error(msg string) {
    fmt.Printf("[ERROR] %s\n", msg)
}

func main() {
    var log Logger
    log.Info("System started")
    log.Error("Connection failed")
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 3. 总结

空结构体是Go语言中实现高性能代码的重要工具,特别适用于:

  1. 需要集合语义但不需要存储数据的场景
  2. 纯信号通知的并发通信
  3. 无状态的方法集合

合理使用空结构体可以显著降低内存占用,提升程序性能。