什么时候适合在 Go 中的结构体中嵌入互斥体?
在 Go 中,结构体提供了一种封装相关数据的便捷方法。开发人员经常将互斥体合并到结构中以保护对其内部字段的并发访问。这种方法提出了嵌入式互斥体是否比本地或全局互斥体具有优势的问题。
嵌入式与本地互斥体
在结构中嵌入互斥体,如中所示您提供的代码将互斥体与受保护的数据紧密关联。这使得其目的显而易见并有利于直观使用。例如,要保护结构体 A 的内容,只需使用 a.mu.Lock() 和 a.mu.Unlock()。
嵌入式互斥体与全局互斥体
如果仅存在结构的单个实例,则可能适合使用全局互斥体。这允许多个 goroutine 同时访问该结构。但是,如果结构体的多个实例需要单独保护,则全局互斥体就变得不合适,因为它会将并发限制为一次仅一个实例。
选择适当的解决方案
首选方法取决于具体情况:
True Embedding
虽然将互斥体嵌入为字段很常见,但它不被视为“true”嵌入”,因为字段名称是明确指定的。真正的嵌入会删除字段名称,如提供的示例所示:
var hits struct { sync.Mutex n int }
这允许您直接在结构本身上调用 Lock() 和 Unlock(),而无需指定字段名称。
以上是什么时候应该在 Go 结构中嵌入互斥体?的详细内容。更多信息请关注PHP中文网其他相关文章!