Go 笔记
类型断言 x.T x接口类型值,T类型。 // 变量类型不是任何的接口类型时,我们就需要先把它转成某个接口类型的值 // 可以使用 interface{}(x).(map[int]string) interface{}(x).([]string) 数组和切片 x := 11 s := []int{3, 6, 8, 11, 45, 7, 47, 49, 55, 59, 70} //sort.Slice(s, func(i, j int) bool { // return s[i] < s[j] //}) sort.Ints(s) fmt.Println(s) sort.Sort(sort.Reverse(sort.IntSlice(s))) //fmt.Println(s) // 顺序数组,小于i全部不满足,大于i全部满足。返回满足条件的最小i // 返回true向左,false向右 pos := sort.Search(len(s), func(i int) bool { fmt.Println(s[i]) return s[i] <= x }) fmt.Println(pos) if pos < len(s) && s[pos] == x { fmt.Println(x, " 在 s 中的位置为:", pos) } else { fmt.Println("s 不包含元素 ", x) } 字典 map[string]int key 必须为值类型,不能为切片,方法,字典 按key生成哈希值,所以速度与key的长度相关 非并发安全。 可以加锁操作或者用sync.Map。 通道1 缓冲通道:发送副本值到通道, 接收方从通道取。 空通道(有接收方等待时)或非缓冲通道:直接复制发送副本到接受方 发送方控制通道关闭。 发送完,即可关闭。接收方仍可取,取完即关闭。 浅复制,数组全复制(值类型)。切片即指针复制 通道2 select case 条件,先全部求值,再选中。多个符合,伪随机。 ...
Mysql 笔记
mysql 执行步骤 show processlist;//显示所有进程 过程讲解: 总结 执行一条 SQL 查询语句,期间发生了什么? 连接器:建立连接,管理连接、校验用户身份; 查询缓存:查询语句如果命中查询缓存则直接返回,否则继续往下执行。MySQL 8.0 已删除该模块; 解析 SQL,通过解析器对 SQL 查询语句进行词法分析、语法分析,然后构建语法树,方便后续模块读取表名、字段、语句类型; 执行 SQL:执行 SQL 共有三个阶段: 预处理阶段:检查表或字段是否存在;将 select * 中的 * 符号扩展为表上的所有列。 优化阶段:基于查询成本的考虑, 选择查询成本最小的执行计划; 执行阶段:根据执行计划执行 SQL 查询语句,从存储引擎读取记录,返回给客户端; redo log 及 binlog redo: redo属于存储引擎层(如InnoDB),记录了数据的偏移,适当时间会更新到硬盘。环形结构。 redo log 是物理日志,记录的是“在某个数据页上做了什么修改” binlog: binlog 是 MySQL 的 Server 层实现的,所有引擎都可以使用。 binlog 是逻辑日志,记录的是这个语句的原始逻辑,比如“给 ID=2 这一行的 c 字段加 1 ” 更新时逻辑,两阶段提交。 先redo log(prepare阶段),再binlog,最后commit 隔离级别 在 MySQL 中,实际上每条记录在更新的时候都会同时记录一条回滚操作。记录上的最新值,通过回滚操作,都可以得到前一个状态的值。 尽量不要使用长事务 当没有比回滚日志更早的读视图(读视图在事务开启时创建)的时候,这个数据不会再有谁驱使它回滚了,这个回滚日志也就失去了用武之地,可以删除了 ...