后端开发常常需要设计定时器,介于现在可用的网络库和第三方库较为全面,所以不需要我们自己造轮子了,有时候做技术开发需要知其然,知其所以然。定时器的实现有很多种方式,采用小根堆实现定时器是较为常见的一种。
一个假定的定时器结构
如果用golang实现,定时器的每个任务应该包含如下结构
1 | type HeapEle struct { |
前文介绍了golang实现基本的四中排序,本文带领大家实现堆排序,堆排序是效率很高的算法,通过取出大根堆堆顶元素从而实现排序的算法。
该算法以出色的效率著称,时间复杂度为O (nlgn)
做游戏或金融后台开发,经常会遇到设计开发排行榜的需求。比如玩家的充值排行,战力排行等等。而这种排行基本都是即时更新的,快速排序对于单一类型排序可以满足需求,但是对于多种类的排序就很吃力,比如实现一个排行榜,有战力排序,有充值排序,如下图
map同样也是引用类型,map在使用前需要通过make进行初始化,否则会报panic错误。
1 | type PersonInfo struct { |
可以看到map使用前用make先构造初始化,之后进行了插入,如果key存在,则修改value
1 | //从这个map查找键为"1234" |
查找指定key,返回值为value和bool类型结果,所以先判断bool类型值是否为true
golang 中变量类型分为引用类型和值类型(也叫作内置类型)
值类型:基本数据类型int、float、bool、string以及数组和struct
引用类型:指针、slice、map、chan等都是引用类型。这类型变量需要通过make构造
golang中函数传递参数,只有值传递一种,也就是实参内容按照值copy方式传递给形参。
当函数的形参变量类型为指针,slice,map,chan等类型时,虽然实参和形参地址不同,但是内部指向了同一个地址,所以可以达到修改指定空间数据的目的。
不要着急,接下来我会写一写小demo帮助大家理解。
Cobra是golang的命令行参数库,可以配置命令启动,读取参数等。
将cobra下载到 $GOPATH,用命令:
1 | go get -v github.com/spf13/cobra/cobra |
然后使用 go install github.com/spf13/cobra/cobra, 安装后在 $GOBIN 下出现了cobra 可执行程序。
cobra程序只能在GOPATH之下使用,所以首先你需要进入到GOPATH的src目录之下,在该目录下,输入:
1 | cobra init demo |
$GOPATH目录下生成了demo文件夹,其组织形式如下
1 | demo |
进去该文件夹,运行:
1 | go run main.go |
本文介绍基本的golang变量和简单的demo,该系列博文由浅入深,带领大家初入golang。
1 | var v1 int //整形 |
如注释所说,上面就是以后会用到的基本类型,切片可以理解为C++的vector,python的list。
可以用括号把两个变量括起来一起定义。
irreversible = 0,该区块已经被当前节点应用,并且被认为是不可逆的。
validated = 1,这是由一个有效生产者签名的完整区块,并且之前已经被当前节点应用,因此该区块已被验证但未成为不可逆。
complete = 2,这是一个由有效生产者签名的完整区块,但是还没有成为不可逆,也没有被当前节点应用。
incomplete = 3,这是一个未完成的区块,未被生产者签名也没有被某个节点生产。
实际上块的状态就是,1未签名未应用 2已签名未应用 3 已签名和应用,未变成不可逆 4 变成不可逆
apply_context,应用上下文,处理节点应用区块的上下文环境,其中包含了迭代器缓存iterator_cache
transaction_context,事务上下文环境。包括controller,db的session,signed_transaction等。
mutable_db(),返回一个chainbase::database的引用
controller_impl结构体的实例的唯一指针my。controller核心功能都是通过impl实现调用的。
1 | struct controller_impl { |
controller_impl 几个重要的成员
db用于存储已执行的区块,这些区块可以回滚,一旦提交就不可逆
reversible_blocks用于存储已执行,但是这些区块是可逆的
pending用于存放当前正在生产或者验证(收到)的区块
fork_db用于存放所有区块(包括自己生产和收到的),这些区块链是可分叉的
之前讲述过linux环境下Go语言开发环境搭建,这次简述下windows的搭建以及vscode配置
同样去https://studygolang.com/dl下载windows环境go安装包
直接下载msi安装