求阙厅

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

Go 系列 数据结构-string

Go标准库 builtin 给出了所有内置类型的定义。源代码位于 src/builtin/builtin.go ,其中关于string的描述如下: 1 2 3 4 // string is the set of all strings of 8-bit bytes, conventionally but not // necessarily representing UTF-8-enco...

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 系列 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 标准库

在Go服务器中,每个传入的请求都在自己的goroutine中处理。请求的处理程序经常启动额外的goroutine来访问后端服务,如数据库和RPC服务。处理一个请求的一组goroutine通常需要访问该请求相关的特定的值,比如最终用户的身份、授权令牌和请求的deadline等。当一个请求被取消或处理超时时,所有在该请求上工作的goroutines应该迅速退出,以便系统可以回收他们正在使用的任何...

面试题-Golang汇总

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

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

MySQL 技术内幕:InnoDB存储引擎

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