Gorm是Go语言开发用的比较多的一个ORM.它的功能比较全:
但是这篇文章中并不会直接看Gorm的源码,我们会先从database/sql分析.原因是Gorm也是基于这个包来封装的一些功能.所以只有先了解了database/sql包才能更加好的理解Gorm源码.
database/sql 其实也是一个对于mysql驱动的上层封装."github.com/go-sql-driver/mysql"就是一个对于mysql的驱动,database/sql 就是在这个基础上做的基本封装包含连接池的使用
下面这个是最基本的增删改查操作
操作分下面几个步骤:
因为Gorm的连接池就是使用database/sql包中的连接池,所以这里我们需要学习一下包里的连接池的源码实现.其实所有连接池最重要的就是连接池对象、获取函数、释放函数下面来看一下database/sql中的连接池.
DB对象
获取方法
释放连接方法
连接池的实现有很多方法,在database/sql包中使用的是chan阻塞 使用map记录等待列表,等到有连接释放的时候再把连接传入等待列表中的chan 不在阻塞返回连接.
之前我们看到的Redigo是使用一个chan 来阻塞,然后释放的时候放入空闲列表,在往这一个chan中传入struct{}{},让程序继续 获取的时候再从空闲列表中获取.并且使用的是链表的结构来存储空闲列表.
database/sql 是对于mysql驱动的封装,然而Gorm则是对于database/sql的再次封装.让我们可以更加简单的实现对于mysql数据库的操作.
这些基础的功能就不多说了,大家可以直接看官方的 文档 .
看源码的时候发现一个非常有意思的调试接口, /debug/vars 会把所有注册的变量打印到接口里面.这个接口很有情怀.
感觉这个包还是针对简单变量,比如整形、字符串这种比较好用.
看到就写了,并没有什么沉淀,写得挺乱的.这个包很简单,但是里面还是有些可以借鉴的编码和设计.新版本的 Golang 已经能解析整形为 Key 的哈希表了,这个包啥时候能跟上支持一下?
进入cobra框架后,我们直接查看getRunCmd,这个是命令run的入口,主要工作都是从这里开始.
重点关注初始化Runner,这个是通过js脚本,使用goja库解析后,生成的实际执行单元.
进入js目录,查看Runner的结构,runner.go
Runner有一些配置属性,另外还有方法,方法用lib.Runner的接口进行规范.
Runner有一个NewVU方法,里面定义了连接参数,实现api测试
返回主函数,在初始化完成Runner后,启动调度器,以及做结果收集
最终封装成一个engine
启动测试
①..Docker项目
网址为 .
介绍:Docker是一种操作系统层面的虚拟化技术,可以在操作系统和应用程序之间进行隔离,也可以称之为容器.Docker可以在一台物理服务器上快速运行一个或多个实例.例如,启动一个Cent OS操作系统,并在其内部命令行执行指令后结束,整个过程就像自己在操作系统一样高效.
介绍:Google公司开发的构建于Docker之上的容器调度服务,用户可以通过Kubernetes集群进行云端容器集群管理.
介绍:一款分布式、可靠的KV存储系统,可以快速进行云配置.
介绍:beego是一个类似Python的Tornado框架,采用了RESTFul的设计思路,使用Go语言编写的一个极轻量级、高可伸缩性和高性能的Web应用框架.
介绍:一款快速构建模块化的Web应用的Web框架.
网址为 Labs/codis.
介绍:国产的优秀分布式Redis解决方案.
在前一小节中介绍了点亮第一个LED灯,这里我们准备进阶尝试下,输出第一段PWM波形.(PWM也就是脉宽调制,一种可调占空比的技术,得到的效果就是:如果用示波器测量引脚会发现有方波输出,而且高电平、低电平的时间是可调的.)
这里爪爪熊准备写成一个golang的库,并开源到github上,后续更新将直接更新到github中,如果你有兴趣可以和我联系. github.com/dpawsbear/bear_rpi_go
我在很多的教程中都看到说树莓派的PWM(硬件)只有一个GPIO能够输出,就是 GPIO1 .这可是不小的打击,因为我想使用至少四个 PWM ,还是不死心,想通过硬件手册上找寻蛛丝马迹,看看究竟怎么回事.
根据以上两个图对比可以发现如下规律:
为了验证个人猜想是否正确,这里先直接使用指令的模式,模拟配置下是否能够正常输出.
小节:树莓派具有四路硬件输出PWM能力,但是四路中只能输出两个独立(占空比独立)的PWM,同时四路输出的频率均是恒定的.
因为拿到了手册,这里我想直接操作寄存器的方式进行设置,也是顺便学习下Go语言处理寄存器的过程.首先需要拿到pwm 系列寄存器的基地址,但是翻了一圈手册,发现只有偏移,没有找到基地址.
以下是demo(pwm) 源码
本教程介绍了使用 Godatabase/sql及其标准库中的包访问关系数据库的基础知识.
您将使用的database/sql包包括用于连接数据库、执行事务、取消正在进行的操作等的类型和函数.
在本教程中,您将创建一个数据库,然后编写代码来访问该数据库.您的示例项目将是有关老式爵士乐唱片的数据存储库.
首先,为您要编写的代码创建一个文件夹.
①.、打开命令提示符并切换到您的主目录.
在 Linux 或 Mac 上:
在 Windows 上:
运行go mod init命令,为其提供新代码的模块路径.
此命令创建一个 go.mod 文件,您添加的依赖项将在其中列出以供跟踪.
注意: 在实际开发中,您会指定一个更符合您自己需求的模块路径.有关更多信息,请参阅一下文章.
GO语言(二十五):管理依赖项(上)
GO语言(二十六):管理依赖项(中)
GO语言(二十七):管理依赖项(下)
此时此刻呢,您将创建一个数据库.
在此步骤中,您将创建要使用的数据库.您将使用 DBMS 本身的 CLI 创建数据库和表,以及添加数据.
您将创建一个数据库,其中包含有关黑胶唱片上的老式爵士乐录音的数据.
这里的代码使用MySQL CLI,但大多数 DBMS 都有自己的 CLI,具有类似的功能.
①.、打开一个新的命令提示符.
在命令行,登录到您的 DBMS,如下面的 MySQL 示例所示.
将以下 SQL 代码粘贴到文件中,然后保存文件.
在此 SQL 代码中:
(1)删除名为album表. 首先执行此命令可以让您更轻松地稍后重新运行脚本.
您将使用以下形式的source命令:
此时此刻呢,您将编写一些 Go 代码进行连接,以便进行查询.
现在你已经有了一个包含一些数据的数据库,开始你的 Go 代码.
找到并导入一个数据库驱动程序,该驱动程序会将您通过database/sql包中的函数发出的请求转换为数据库可以理解的请求.
①.、在您的浏览器中,访问SQLDrivers wiki 页面以识别您可以使用的驱动程序.
在此代码中:
(1)将您的代码添加到main包中,以便您可以独立执行它.
导入驱动程序后,您将开始编写代码以访问数据库.
现在编写一些 Go 代码,让您使用数据库句柄访问数据库.
您将使用指向结构的指针sql.DB,它表示对特定数据库的访问.
编写代码
①.、进入 main.go,在import您刚刚添加的代码下方,粘贴以下 Go 代码以创建数据库句柄.
该Config结构使代码比连接字符串更容易阅读.
为了简化代码,您调用log.Fatal结束执行并将错误打印到控制台.在生产代码中,您会希望以更优雅的方式处理错误.
文件的顶部现在应该如下所示:
①.、开始跟踪 MySQL 驱动程序模块作为依赖项.
使用go get 添加 github.com/go-sql-driver/mysql 模块作为您自己模块的依赖项.使用点参数表示"获取当前目录中代码的依赖项".
连接成功了!
此时此刻呢,您将查询一些数据.