空结构体在 go 语言中有明确用途:1. 节省内存,适用于集合或状态标记场景,如 map[string]struct{} 不占内存;2. 作为信号量用于并发通信,如 chan struct{} 表示无数据的通知信号;3. 实现接口时无需内部状态,用 struct{} 简洁清晰。这些特性体现了其在高效编程中的重要作用。
空结构体在 Go 语言中看起来没什么用,但它其实挺有讲究的。最常见的用途有两个:一个是节省内存,另一个是作为信号量使用。理解这两个用途,能帮你写出更高效、清晰的代码。
在一些数据结构中,比如集合(Set)或者标记某个状态是否存在的场景下,我们可能不需要存储实际的数据,只需要记录“存在”或“不存在”。这时候如果用
map[string]bool
map[string]struct{}
Go 的运行时对
struct{}
立即学习“go语言免费学习笔记(深入)”;
var s struct{} fmt.Println(unsafe.Sizeof(s)) // 输出 0
所以,在定义类似集合的数据结构时,推荐写法是:
set := make(map[string]struct{}) set["a"] = struct{}{}
这样比起用
bool
在并发编程中,我们经常需要从一个 goroutine 向另一个发送“通知”或“完成信号”,而不需要附带任何数据。这时候就可以用
chan struct{}
相比使用
chan bool
chan int
chan struct{}
举个简单的例子:
done := make(chan struct{}) go func() { // 做一些事情 close(done) }() <-done fmt.Println("任务完成")
这里
done
struct{}
这种做法在标准库中也很常见,比如
context.Context
chan struct{}
有时候我们会定义一个接口,但并不关心具体的数据内容,只关注方法是否存在。这种情况下,使用
struct{}
例如:
type Runner interface { Run() } type MyRunner struct{} func (m MyRunner) Run() { fmt.Println("running") }
这里
MyRunner
Runner
基本上就这些。别看它小,但在合适的场景下非常实用,也体现了 Go 设计上的精简与高效。
以上就是Golang空结构体有什么特殊用途 解析内存优化与信号场景的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 //m.sbmmt.com/ All Rights Reserved | php.cn | 湘ICP备2023035733号