最小堆以及优先级队列的Golang实现

前言 堆,是计算机科学中的一种特别的完全二叉树。若父节点的值恒小于等于子节点的值,此堆称为最小堆(min heap);反之,若母节点的值恒大于等于子节点的值,此堆称为最大堆(max heap)。在堆中最顶端的那一个节点,称作 根节点(root node),根节点本身没有 父节点(parent node)。堆通常是一个可以被看做一棵树的数组对象。在队列中,调度程序反复提取队列中第一个作业并运行,因为实际情况中某些时间较短的任务将等待很长时间才能结束,或者某些不短小,但具有重要性的作业,同样应当具有优先权。堆即为解决此类问题设计的一种数据结构。 ...

May 13, 2021 · JemmyHu(hujm20151021@gmail.com)

Golang Channel详解

一、原理 0. 简介 channel 分为有缓冲和无缓冲,或者阻塞和非阻塞,主要区别就在于是否有 容量capacity。 在 runtime 中是通过 hchan 这个结构体来表示的,它里面的主要成员可以理解成包含两个大部分:环形队列相关 和 sudog等待队列 相关。 对于有缓冲的 channel,会设置环形队列相关的参数,如已有的元素数量、容量、指向队列的指针等; 等待队列有发送等待队列和接受等待队列,他们分别在发送时 channel 已满、接收时 channel 为空的情况下,会将当前 goroutine 打包成一个 sudog 结构,添加到对应的队列中,直到条件符合时再被唤醒工作。 ...

April 9, 2021 · JemmyHu(hujm20151021@gmail.com)

Golang中使用RSA进行加解密

本文对 RSA 加密算法 的细节不做深究,仅描述大致用法。具体算法原理请阅读参考文献中的 2 和 4。 一、介绍 当我们谈论加解密方式时,通常有两种情形:对称加密 和 非对称加密。 ...

January 14, 2021 · JemmyHu(hujm20151021@gmail.com)

Boltdb使用(一)基本用法

介绍 boltdb 是一个使用 Go 编写的键值对数据库,它的目标是 简单、快速和稳定的轻型数据库,适用于那些不需要使用像 MySQL 一样的完整的数据库系统的项目。 使用 1. 安装 go get github.com/boltdb/bolt/... 2. 打开(Open)一个数据库文件连接 func main() { dbPath := "./data.db" // 指定你的数据库文件要存储的地方 db, err := bolt.Open(dbPath, os.ModePerm, nil) if err != nil { panic(err) } ... } bolt 打开一个文件之后,会一直获得此文件的锁,在这期间,其他的进程无法再次打开此文件,直到最开始的进程释放锁。打开一个已经打开的 bolt文件 会导致当前进程无限制地等待下去,直到另一个已经打开的进程结束这个文件的使> 用。为了避免这种无限制的等待,可以给 Open 操作添加超时: ...

January 5, 2021 · JemmyHu(hujm20151021@gmail.com)

Golang-map详解

一、设计原理 哈希表(也就是我们说的map)是计算机应用领域非常重要的数据结构之一,读写的时间复杂度均是O(1),是典型的 以空间换时间 设计。它的优点除了读写性能优异,还在于它提供了键值之间的映射,为程序设计提供了极大的方便。要想实现一个性能优异的哈希表,需要关注两个关键点:哈希函数 和 冲突解决方法。 ...

September 18, 2020 · JemmyHu(hujm20151021@gmail.com)

Golang-GPM调度原理

一、概述 1. 为什么在内核的线程调度器之外,Go 还需要实现一个自己的调度器 主要解决系统线程太重的问题: 创建与切换线程 太重:都需要在用户态和内核态之间切换,开销较大; 系统线程内存使用 太重:一方面,创建系统线程时会分配一段大部分情况下都用不完的栈内存,造成浪费;另一方面,栈内存空间创建后其大小不会再变化,有溢出的风险。 goroutine 是 Go 语言实现的用户态的线程,可以看做是对系统线程进行的一层抽象。有了这层抽象,Golang 程序员不会直接面对系统线程,直接使用 goroutine 就可以了,而操作系统不会 care 什么 goroutine,只是执行设定好的系统线程就好了。这层抽象,就是 Go 的调度器,后面会详细说明。Go 很精巧地解决了上述两个问题: ...

September 18, 2020 · JemmyHu(hujm20151021@gmail.com)

Golang-unsafe包详解

1. Go语言指针的限制 go语言中也有指针,但相对C语言的指针来说,有了很多限制,但这也算是go的成功之处:既可以享受指针带来的便利,又避免了指针过度使用带来的危险。主要的限制如下: ...

September 17, 2020 · JemmyHu(hujm20151021@gmail.com)

Golang-数组,切片和字符串

在主流的编程语言中数组及其相关的数据结构是使用得最为频繁的,只有在它(们)不能满足时才会考虑链表、hash 表(hash 表可以看作是数组和链表的混合体)和更复杂的自定义数据结构。 ...

September 16, 2020 · JemmyHu(hujm20151021@gmail.com)

Golang-关于函数调用

一、 前言 我们完成程序的编写之后,经过编译,编译器会将我们的程序编译成一行行机器指令,放到一个可执行文件中;程序执行时,可执行文件被加载到内存,机器执行被放置到虚拟内存的“代码段”,并分配以及初始化程序运行过程中需要的堆栈。会形成如下的结构: ...

September 15, 2020 · JemmyHu(hujm20151021@gmail.com)