当前位置: 首页 > news >正文

golang优雅代码【lock实现】

golang优雅代码【lock实现】

  • 1.局部锁
    • 1.1 具体实现方式

本文代码风格来源参考 database/sql
更加深刻理解go语言圣经中函数是一等公民

1.局部锁

database/sql源码中使用 withLock(dc, func(){...}) 方法实现局部锁,完美利用了 golangdefer 关键字对 入参dc 进行加锁解锁,感觉实现很优雅

func (db *DB) queryDC(ctx, txctx context.Context, dc *driverConn, releaseConn func(error), query string, args []any) (*Rows, error) {queryerCtx, ok := dc.ci.(driver.QueryerContext)...if ok {...withLock(dc, func() {// do something ... })...}...return rows, nil
}

1.1 具体实现方式

  1. 首先定义 driverConn 封装 sync.Mutex,实现 sync.Locker 接口
type driverConn struct {db        *DB...sync.Mutex  // guards following
}
  1. 定义函数 withLock ,接收 sync.Locker , func() 入参,在内部实现获取/释放锁,并执行对应函数
// withLock runs while holding lk.
func withLock(lk sync.Locker, fn func()) {lk.Lock()defer lk.Unlock() // in case fn panicsfn()
}
  1. 使用该方式实现锁
func (db *DB) queryDC(ctx context.Context, dc *driverConn) (*Rows, error) {...// 获取&释放锁withLock(dc, func() {// do something ... })...return rows, nil
}
  1. 对比普通方式(非常容易忘记释放锁,并且还要考虑errror)
func (db *DB) queryDC(ctx context.Context, dc *driverConn) (*Rows, error) {...// 获取&释放锁dc.Lock()// do something ... dc.Unlock()...return rows, nil
}
http://www.lryc.cn/news/369473.html

相关文章:

  • Dijkstra算法(迪杰斯特拉算法)
  • 用函数指针求a和b中的大者
  • 鸿蒙轻内核M核源码分析系列六 任务及任务调度(2)任务模块
  • 解决找不到MSVCR120.dll,无法执行代码
  • Linux iptables详解
  • Mac电脑arm64芯片Cocoapods 的 ffi 兼容问题
  • 如何提高逻辑性?(小妙招)
  • 2024050501-重学 Java 设计模式《实战命令模式》
  • 0104__Linux 中 nm 命令简介
  • Linux网络服务
  • Vue18-列表渲染
  • 【三维重建】增量SFM系统
  • PyTorch 维度变换-Tensor基本操作
  • spring 事务失效的几种场景
  • 45岁程序员独白:中年打工人出路在哪里?
  • 深度探讨:为何训练精度不高却在测试中表现优异?
  • 动态内存管理<C语言>
  • 第一百零二节 Java面向对象设计 - Java静态内部类
  • 给自己Linux搞个『回收站』,防止文件误删除
  • Springboot接收参数的21种方式
  • 打造出色开发者体验的十大原则
  • Vue3_对接腾讯云COS_大文件分片上传和下载
  • python免杀--base64加密(GG)
  • Python版与Java版城市天气信息爬取对比分析
  • CSS真题合集(二)
  • 长期出汗困扰你?可能是肾合出了问题
  • Jmeter函数二次开发说明
  • 重新学习STM32(1)GPIO
  • React+TS前台项目实战(二)-- 路由配置 + 组件懒加载 + Error Boundary使用
  • 成为电商低价神秘顾客访问员的必备条件(深圳神秘顾客公司)