郑文峰的博客 郑文峰的博客
首页
  • Go语言高性能编程
分类
标签
归档
关于
  • 导航 (opens new window)
  • 代码片段 (opens new window)
  • 收藏
  • 友链
  • 外部页面

    • 开往 (opens new window)
GitHub (opens new window)

zhengwenfeng

穷则变,变则通,通则久
首页
  • Go语言高性能编程
分类
标签
归档
关于
  • 导航 (opens new window)
  • 代码片段 (opens new window)
  • 收藏
  • 友链
  • 外部页面

    • 开往 (opens new window)
GitHub (opens new window)
  • python

  • go语言

    • go简单使用grpc
    • gin中validator模块的源码分析
    • 优化gin表单的错误提示信息
    • go中如何处理error
    • tcp缓存引起的日志丢失
    • 使用etcd分布式锁导致的协程泄露与死锁问题
    • go语言高性能编程

      • Go协程池深度解析:原理、实现与最佳实践
      • Go语言Interface Boxing原理与性能优化指南
      • Go语言遍历性能深度解析:从原理到优化实践
      • Go语言零拷贝技术完全指南
      • Go语言不可变数据共享:无锁并发编程实践
      • Go语言内存预分配完全指南
      • Go语言原子操作完全指南
      • Go语言堆栈分配与逃逸分析深度解析
      • Go语言空结构体:零内存消耗的高效编程
        • 1. 前言
        • 2. 应用场景
          • 2.1 实现 Set 数据结构
          • 2.2 作为channel的信号
          • 2.3 仅包含方法的结构体
        • 3. 总结
      • Go语言结构体内存对齐完全指南
      • Go语言字符串拼接性能对比与优化指南
      • Go语言延迟初始化(Lazy Initialization)最佳实践
      • Go语言高效IO缓冲技术详解
  • linux

  • 其他

  • 编程
  • go语言
  • go语言高性能编程
zhengwenfeng
2025-06-14
目录

Go语言空结构体:零内存消耗的高效编程

# 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. 无状态的方法集合

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

#go语言#go语言高性能编程
上次更新: 2025/06/14, 16:16:07
Go语言堆栈分配与逃逸分析深度解析
Go语言结构体内存对齐完全指南

← Go语言堆栈分配与逃逸分析深度解析 Go语言结构体内存对齐完全指南→

最近更新
01
Go语言高效IO缓冲技术详解
06-14
02
Go语言延迟初始化(Lazy Initialization)最佳实践
06-14
03
Go语言字符串拼接性能对比与优化指南
06-14
更多文章>
Theme by Vdoing | Copyright © 2022-2025 zhengwenfeng | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式