Go语言学习笔记 · 第十六节
《Go语言学习笔记》第十六节
本节分析了Go运行时中channel、select、defer、panic/recover和finalizer的实现原理。
本节分析了Go运行时中channel、select、defer、panic/recover和finalizer的实现原理。
channel同步模式下,收发双方先寻找匹配方直接拷贝数据,否则入队等待唤醒;异步模式围绕缓冲槽,有空位才发送、有数据才接收,关闭时唤醒全部排队者。select从多个channel中随机选取可用者,无可用则尝试default或把自己排入所有队列等待唤醒,每次操作需对全部channel加锁。defer由deferproc创建延迟对象挂到G链表,函数结束时deferreturn执行,通过汇编jmpdefer实现循环调用;因涉及对象分配和多次调用,性能约为直接调用的四分之一。panic将错误挂到G._panic链表并遍历defer链表,遇recover则正常返回,否则执行完延迟函数后终止进程。SetFinalizer把析构函数存入span.specials链表,不可达时由finblock队列收集,专门的finggoroutine串行执行;finalizer会延长对象生命周期,执行时机不确定。