《Go 语言第一课》课程学习笔记(十三) 类型嵌入指的就是在一个类型的定义中嵌入了其他类型。Go 语言支持两种类型嵌入,分别是接口类型的类型嵌入和结构体类型的类型嵌入。接口类型的类型嵌入接口类型声明了由一个方法集合代表的接口,比如下面接口类型 E:type E interface {M1()M2()这个接口类型 E 的方法集合,包含两个方法,分别是 M1 和 M2,它们组成了 E 这个接口类型所代表的接口。如果某个类型实现了方法 M1 和 M2,我们就说这个类型实现了 E 所代表的接口。
《Go 语言第一课》课程学习笔记(十一) Go 语言的 if 语句还有其他多种形式,比如二分支结构和多(N)分支结构。多分支结构引入了 else if。支持声明 if 语句的自用变量无论是单分支、二分支还是多分支结构,我们都可以在 if 后的布尔表达式前,进行一些变量的声明,在 if 布尔表达式前声明的变量,称为 if 语句的自用变量。顾名思义,这些变量只可以在 if 语句的代码块范围内使用。在 if 语句中声明自用变量是 Go 语言的一个惯用法,这种使用方式直观上可以让开发者有一种代码行数减少的感觉,提高可读性。同时,由于这些变量是 i
《Go 语言第一课》课程学习笔记(十) map 是 Go 语言提供的一种抽象数据类型,它表示一组无序的键值对。我们会直接使用 key 和 value 分别代表 map 的键和值。而且,map 集合中每个 key 都是唯一的。。key 与 value 的类型可以相同,也可以不同。如果两个 map 类型的 key 元素类型相同,value 元素类型也相同,那么我们可以说它们是同一个 map 类型,否则就是不同的 map 类型。Go 语言中要求,key 的类型必须支持“==”和“!=”两种比较操作符。
《Go 语言第一课》课程学习笔记(九) 常量:Go 在“常量”设计上的创新有哪些?Go 语言在常量方面的创新包括下面这几点:支持无类型常量;支持隐式自动转型;可用于实现枚举。常量Go 语言的常量是一种在源码编译期间被创建的语法元素。这是在说这个元素的值可以像变量那样被初始化,但它的初始化表达式必须是在编译期间可以求出值来的。Go 常量一旦声明并被初始化后,它的值在整个程序的生命周期内便保持不变。我们在并发设计时不用考虑常量访问的同步,并且被创建并初始化后的常量还可以作为其他常量的初始表达式的一部分。Go 是使用
《Go 语言第一课》课程学习笔记(五) 入口函数与包初始化:搞清 Go 程序的执行次序main.main 函数:Go 应用的入口函数Go 语言中有一个特殊的函数:main 包中的 main 函数,也就是 main.main,它是所有 Go 可执行程序的用户层执行逻辑的入口函数。Go 程序在用户层面的执行逻辑,会在这个函数内按照它的调用顺序展开。main 函数的函数原型非常简单,没有参数也没有返回值。Go 语言要求:可执行程序的 main 包必须定义 main 函数,否则 Go 编译器会报错。在启动了多个 Goroutine 的 Go
《Go 语言第一课》课程学习笔记(三) 构建模式:Go 是怎么解决包依赖管理问题的?Go 项目的布局标准是什么?首先,对于以生产可执行程序为目的的 Go 项目,它的典型项目结构分为五部分:放在项目顶层的 Go Module 相关文件,包括 go.mod 和 go.sum;cmd 目录:存放项目要编译构建的可执行文件所对应的 main 包的源码文件;项目包目录:每个项目下的非 main 包都“平铺”在项目的根目录下,每个目录对应一个 Go 包;internal 目录:存放仅项目内部引用的 Go 包,这些包无法被项目之外引用;ven
《MySQL 实战 45 讲》课程学习笔记(五) 数据库锁:全局锁、表锁和行锁根据加锁的范围,MySQL 里面的锁大致可以分成全局锁、表级锁和行锁三类。全局锁全局锁就是对整个数据库实例加锁。MySQL 提供了一个加全局读锁的方法,命令是 Flush tables with read lock (FTWRL)。当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句。全局锁的典型使用场景是,做全库逻辑备份。也就是把整
《MySQL 实战 45 讲》课程学习笔记(四) 深入浅出索引索引的出现其实就是为了提高数据查询的效率,就像书的目录一样。索引的常见模型哈希表哈希表是一种以键 - 值(key-value)存储数据的结构,我们只要输入待查找的值即 key,就可以找到其对应的值即 Value。哈希的思路很简单,把值放在数组里,用一个哈希函数把 key 换算成一个确定的位置,然后把 value 放在数组的这个位置。不可避免地,多个 key 值经过哈希函数的换算,会出现同一个值的情况。处理这种情况的一种方法是,拉出一个链表。哈希表这种结构适用于只有等值查询的
《MySQL 实战 45 讲》课程学习笔记(三) 在可重复读隔离级别下,事务在启动的时候就“拍了个快照”。按照可重复读的定义,一个事务启动的时候,能够看到所有已经提交的事务结果。但是之后,这个事务执行期间,其他事务的更新对它不可见。对于当前事务的启动瞬间来说,一个数据版本的 row trx_id,有以下几种可能:一个数据版本,对于一个事务视图来说,除了自己的更新总是可见以外,有三种情况:事务的可重复读的能力是怎么实现的?
《MySQL 实战 45 讲》课程学习笔记(二) 日志系统:一条 SQL 更新语句是如何执行的?与查询流程不一样的是,更新流程还涉及两个重要的日志模块:redo log(重做日志)和 binlog(归档日志)。重要的日志模块:redo logMySQL 的 WAL 技术WAL 的全称是 Write-Ahead Logging,它的关键点就是先写日志,再写磁盘。当有一条记录需要更新的时候,InnoDB 引擎就会先把记录写到 redo log 里面,并更新内存,这个时候更新就算完成了。InnoDB 引擎会在适当的时候,将这个操作记录更新到