Golang heap完全解析

heap.Interface是go基础库中提供的一个实现堆功能的工具包。本文将介绍如何使用以及它底层的算法实现。 本质上说,堆就是一种特殊的二叉树。它总是满足下列性质: 堆中某个节点的值总是不大于或不小于其父节点的值;(前者为最大堆,或者为最小堆,本文为了叙述方便,后面涉及的所有默认为最大堆)。 堆总是一棵完全二叉树。 通常(包括go中)我们使用数组来实现堆,此时它还包含以下特性(事实上是二叉树的 …

Go sync.Map原理&使用

Go1.9中新增了一个新的类型sync.Map,它提供并发map的功能,本文针对其讨论两个问题: 在现有标准库下,为什么需要添加sync.Map sync.Map的原理 为什么要有sync.Map?在没有sync.Map的日子里,我们可以通过sync.Mutex或者sync.RWMutex来实现线程安全的Map,把读写操作变成单线程操作来实现。下面是我们使用sync.RWMutex实现的一个简单 …

golang读取关闭channel遇到的问题/如何优雅关闭channel

#核心内容: 已关闭的channel再次读取会出现什么现象? 如何判断channel关闭? 什么是nil channel有什么用? 先看看出问题的代码片段(抽象精简): func TestReadFromClosedChan(t *testing.T) { asChan := func(vs …int) <-chan int { c := make(chan int) go func() …