golang中具有 “no copy“的类型

server/2025/3/13 12:35:42/

在 Go 语言中,某些类型由于特殊用途或底层实现,可能会被标记为 “no copy”,即它们不能被复制,通常是因为复制会导致意外的行为或错误。这些类型主要包括:


1. sync.Mutexsync.RWMutex

  • 原因:Mutex 是用于同步的锁,复制后可能会导致多个实例操作同一个底层锁的情况,从而引发竞争条件或死锁。
  • 示例
    var mu sync.Mutex
    copyMu := mu // ❌ 错误,拷贝 Mutex 会导致不可预测行为
    

2. sync.Cond

  • 原因sync.Cond 依赖于 sync.Mutex,如果复制,会导致多个 Cond 变量竞争同一个锁。
  • 示例
    var cond = sync.NewCond(&sync.Mutex{})
    copyCond := *cond // ❌ 不应该复制
    

3. sync.Once

  • 原因sync.Once 用于确保某段代码只执行一次,复制 Once 可能导致相同的初始化逻辑执行多次。
  • 示例
    var once sync.Once
    copyOnce := once // ❌ 拷贝可能会导致 `Do` 不能正确保证只执行一次
    

4. sync.WaitGroup

  • 原因sync.WaitGroup 维护一个内部计数器,拷贝后多个 WaitGroup 可能操作同一个计数器,导致错误。
  • 示例
    var wg sync.WaitGroup
    copyWg := wg // ❌ 复制 WaitGroup 可能导致等待逻辑混乱
    

5. sync.Pool

  • 原因sync.Pool 是一个对象池,拷贝会导致多个 Pool 可能共享相同的对象存储区,破坏内存管理。
  • 示例
    var pool sync.Pool
    copyPool := pool // ❌ 复制可能导致多个 Pool 共享底层存储,导致数据混乱
    

6. context.Context(通常不应该被复制)

  • 原因context.Context 用于控制超时、取消等,复制 Context 可能会导致取消信号不生效。
  • 示例
    ctx := context.Background()
    copyCtx := ctx // ❌ 复制 context 可能导致错误的取消行为
    

7. runtime/internal/atomic.NoCopy 结构体的类型

  • Go 内部提供了 runtime/internal/atomic.NoCopy 结构体,嵌入该类型的结构体会在 go vet 检查时报错,防止误复制。
  • 示例
    type myStruct struct {noCopy runtime/internal/atomic.NoCopy
    }
    

如何防止结构体被拷贝?

如果你定义的结构体不希望被复制,可以嵌入 sync.NoCopy(Go 1.20 之后正式提供):

import "sync"type MyStruct struct {noCopy sync.NoCopy
}

这样,go vet 工具会在发现 MyStruct 被复制时发出警告。


总结

在 Go 语言中,以下类型通常不能被复制:

  • 同步相关
    • sync.Mutex
    • sync.RWMutex
    • sync.Cond
    • sync.Once
    • sync.WaitGroup
    • sync.Pool
  • 上下文管理
    • context.Context
  • 使用 sync.NoCopyruntime/internal/atomic.NoCopy 防止拷贝的结构体

一般来说,如果一个类型涉及 锁、并发同步、状态管理,就要特别注意 避免拷贝,否则可能会导致竞态条件、锁丢失或不一致行为。


http://www.ppmy.cn/server/174627.html

相关文章

Pytorch实现之利用普通GAN的人脸修复

简介 简介:利用遮挡真实样本的部分面貌,输入给生成器,让生成器输出未被遮挡的面貌,以达到修复人脸的效果。 论文题目:FACE RESTORATION VIA GENERATIVE ADVERSARIAL NETWORKS(基于生成对抗网络的人脸恢复) 会议:2023 Third International Conference on Secure Cybe…

vue3中事件总线

在 Vue 3 中,eventBus 的概念已经被弱,不推荐使用全局事件总线, 你需要一个轻量级的事件总线,可以自己封装一个 EventBus 类,也有一些替代方案 1、使用第三方库(如 mitt 或 tiny-emitter) mi…

基于django+vue的购物商城系统

开发语言:Python框架:djangoPython版本:python3.8数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 系统首页 热卖商品 优惠资讯 个人中心 后台登录 管理员功能界面 用户管理 商品分类管理…

用nodejs加electron加roboticjs判断鼠标点击时是否在浏览器内部

要实现这个功能,你需要使用 Electron 来创建一个桌面应用,然后使用 RobotJS 监听鼠标点击事件,最后判断鼠标点击的位置是否在浏览器内部。以下是一个简单的示例: 首先,确保你已经安装了 Node.js 和 npm。然后&#xff…

MyBatis SqlSession 的作用,以及如何使用 SqlSession 执行 SQL 语句

SqlSession 是 MyBatis 中非常重要的一个接口,它代表了与数据库的一次会话(session)。 可以将 SqlSession 理解为 JDBC 中的 Connection 对象加上一系列操作数据库的方法。 它负责: SqlSession 的作用: 执行 SQL 语句…

一文说清docker及docker compose的应用和部署

前言 本文视频版教程:一个视频说清docker及docker compose的应用和部署(https://cloud.tencent.com/developer/video/82177) 本期教程将介绍Docker和Docker compose的基础应用,通过实际应用来讲解具体使用方法和两者的区别。 假…

1.2 CogPMAlignTool(模板匹配工具), CogFixtureTool(坐标系转换工具)

‌ CogPMAlignTool‌是高精度模板匹配工具,主要用于图像的特征定位和匹配。 ‌ CogFixtureTool是主要用于图像坐标系转换和对齐,就可以把当前拍照的图片固定到之前模板的那张图片。 相当于使用工具CogPMAlignTool‌来测量出当前图片与注册…

使用 OptiSLang 和 MotorCAD 构建一个强大的电机优化元模型

介绍 在本文中,我们将检查这些敏感性分析的结果,并构建一个健壮的元模型,作为优化过程的基础。 本文涵盖: 解释敏感性分析结果了解元模型及其在优化中的重要性构建和完善最佳预后模型 (MOP)使用预后系数…