求阙厅

春有百花秋有月,夏有凉风冬有雪。若无闲事挂心头,便是人间好时节。

Go 系列 数据结构-slice

Slice又称动态数组,依托数组实现,可以方便的进行扩容、传递等,实际使用中比数组更灵活。 正因为灵活,如果不了解其内部实现机制,有可能遭遇莫名的异常现象。 实例 题目一 下面程序输出什么? 1 2 3 4 5 6 7 8 9 10 11 12 13 package main import ( "fmt" ) func main() { var array [1...

Go 系列 数据结构-map

map数据结构 Golang 的 map 使用哈希表作为底层实现,一个哈希表里可以有多个哈希表节点,也即bucket,而每个bucket就保存 了map中的一个或一组键值对。 map数据结构由 runtime/map.go/hmap 定义: 1 2 3 4 5 6 7 8 type hmap struct { count int // 当前保存的元素个数 ... B ...

Go 系列 数据结构-channel

channel 是 Golang 在语言层面提供的 goroutine 间的通信方式,比 Unix 管道更易用也更轻便。channel 主要用于进程内各 goroutine 间通信,如果需要跨进程通信,建议使用分布式系统的方法来解决。 chan数据结构 src/runtime/chan.go:hchan 定义了channel的数据结构: 1 2 3 4 5 6 7 8 9 10...

Go 系列 WaitGroup深入解析

数据结构 源码包中 src/sync/waitgroup.go:WaitGroup 定义了其数据结构: 1 2 3 type WaitGroup struct { state1 [3]uint32 } state1 是个长度为 3 的数组,其中包含了 state 和一个信号量,而 state 实际上是两个计数器: counter: 当前还未执行结束的goroutine...

Go 系列 逃逸分析

所谓逃逸分析(Escape analysis)是指由编译器决定内存分配的位置,不需要程序员指定。函数中申请一个新的对象 如果分配在栈中,则函数执行结束可自动将内存回收; 如果分配在堆中,则函数执行结束可交给 GC(垃圾回收)处理; 有了逃逸分析,返回函数局部变量将变得可能,除此之外,逃逸分析还跟闭包息息相关,了解哪些场景下对象会逃逸至关重要。 逃逸策略 每当函数中申请新的...

Go 系列 垃圾回收

GC(Garbage Collection 垃圾回收),是一种自动管理内存的机制。传统的编程语言(C/C++)中,释放无用变量内存空间是程序员手动释放,存在内存泄漏或者释放不该释放内存等问题。为了解决这个问题,后续的语言(java\python\php\golang等)都引入了语言层面的自动内存管理,语言使用者无需对内存进行手动释放,内存释放由虚拟机(virtual machine)或...

Go 系列 内存分配

Go 语言内置的运行时对内存进行了自主管理,从内存的分配到不再使用时的回收都由标准库自动地完成。这样可以避开系统调用带来的性能问题,并能更好的配合垃圾回收。 Golang 运行时的内存分配算法主要源自 Google 为 C 语言开发的 TCMalloc 算法,全称 Thread-Caching Malloc。核心思想就是把内存分为多级管理,从而降低锁的粒度。它将可用的堆内存采用二级...

Go 系列 Context 标准库

Context 顾名思义是协程的上下文,主要用于跟踪协程的状态,可以做一些简单的协程控制,也能记录一些协程信息

Context 设计目的是跟踪 goroutine 调用树,并在这些 goroutine 调用树中传递通知与元数据。 Context 提供的核心功能是多个 goroutine 之间的退出通知机制,传递数据只是一个辅助功能,应谨慎使用 context 传递数据。 Context们是一棵树 context 整体是一个树形结构,不同的 ctx 间可能是兄弟节点或者是父子节点的关系。 ...

面试题-Golang汇总

golang 中如何实现 producer-consumer 模式 考察对channel的理解和使用,包括对阻塞队列和非阻塞队列的选择和权衡,以及在超时方面是否有控制和考虑等

MySQL 系列 两段锁协议(2PL)

MySQL 技术内幕:InnoDB存储引擎

两段锁协议规定所有的事务应遵守的准则: 在对任何数据进行读、写操作之前,首先要获得该数据的锁。 在释放一个锁之后,事务不再获取其它任何封锁。 因此把事务的执行分为两个阶段: 第一阶段是获得锁的阶段,称为加锁节点,或者扩展阶段。对任何数据进行读操作之前要获得S锁,在进行写操作之前要获得X锁;如加锁不成功,则事务进入等待状态,直到加锁成功才继续执行。 第二阶段是释放锁...