/images/avatar.webp

五岁博客

Go 源码之 gorm 框架

看源码先看底层核心数据结构

在 Go 语言的数据库开发领域,GORM(Go Object Relational Mapping)框架绝对是绕不开的核心工具。

它以“简洁的 API、完整的 ORM 能力、多数据库适配”三大优势,成为开发者连接 MySQL、PostgreSQL 等数据库的首选。

Go 源码深度解析之 chan(环形队列/创建/发送/接收/关闭)

一、简介

写在前面:先写个结论,让大家对该结构的源码有个大概了解,之后再一步一步解析源码。

chan 提供了一种在 goroutine 之间进行数据交换和同步的方式。

通道可以用于控制并发访问和共享数据,从而减少竞态条件和死锁问题,并且可以自然地处理异步事件和信号。

Go 源码深度解析之读写锁 sync.RWMutex(数据结构/读写操作)

一、简介

写在前面:先写个结论,让大家对该结构的源码有个大概了解,之后再一步一步解析源码:

  • 写锁 需要阻塞 写锁:一个协程拥有 写锁 时,其他协程 写锁定 需要阻塞
  • 写锁 需要阻塞 读锁:一个协程拥有 写锁 时,其他协程 读锁定 需要阻塞
  • 读锁 需要阻塞 写锁:一个协程拥有 读锁 时,其他协程 写锁定 需要阻塞
  • 读锁 不能阻塞 读锁:一个协程拥有 读锁 时,其他协程也可以拥有 读锁
  • 写操作通过 readerCount 的操作来阻止读操作的

二、源码

(一)RWMutex数据结构

type RWMutex struct {
    w           Mutex  // 写锁
    writerSem   uint32 // 缓冲信号量,获取写锁的阻塞等待信号队列
    readerSem   uint32 // 缓冲信号量,获取读锁的阻塞等待信号队列
    readerCount int32  // 当前持有读锁的 goroutine 数量,负数表示有个写锁在执行
    readerWait  int32  // 获取写锁时,如果之前还有 readerWait 数量的读锁在执行,则需要等待执行完才能获取写锁
}
  • w