恋恋风辰的个人博客


  • Home

  • Archives

  • Categories

  • Tags

  • Search

解密定时器的实现细节

Posted on 2019-07-02 | In golang

后端开发常常需要设计定时器,介于现在可用的网络库和第三方库较为全面,所以不需要我们自己造轮子了,有时候做技术开发需要知其然,知其所以然。定时器的实现有很多种方式,采用小根堆实现定时器是较为常见的一种。

一个假定的定时器结构

如果用golang实现,定时器的每个任务应该包含如下结构

1
2
3
4
5
6
7
8
type HeapEle struct {
//任务的回调函数
callback func(interface{}) bool
//回调函数的参数
params interface{}
//任务设置的定时器时间
deadline int64
}
Read more »

golang实现堆排序

Posted on 2019-07-01 | In golang

前文介绍了golang实现基本的四中排序,本文带领大家实现堆排序,堆排序是效率很高的算法,通过取出大根堆堆顶元素从而实现排序的算法。
该算法以出色的效率著称,时间复杂度为O (nlgn)

Read more »

golang实现四种排序(快速,冒泡,插入,选择)

Posted on 2019-06-29 | In golang

前面已经介绍golang基本的语法和容器了,这一篇文章用golang实现四种排序算法,快速排序,插入排序,选择排序,冒泡排序。既可以总结前文的基础知识,又可以熟悉下golang如何实现这四种排序。

快速排序

算法介绍

假设用户输入了如下数组

下标 | 0 | 1 | 2 | 3 | 4 | 5 |
数值 | 6 | 2 | 7 | 3 | 8 | 9 |

Read more »

boost::multi_index 提供一种千人在线即时排行榜的设计思路

Posted on 2019-06-23 | In C++

做游戏或金融后台开发,经常会遇到设计开发排行榜的需求。比如玩家的充值排行,战力排行等等。而这种排行基本都是即时更新的,快速排序对于单一类型排序可以满足需求,但是对于多种类的排序就很吃力,比如实现一个排行榜,有战力排序,有充值排序,如下图

Read more »

Go(05)map介绍

Posted on 2019-06-11 | In golang

基本用法

map同样也是引用类型,map在使用前需要通过make进行初始化,否则会报panic错误。

map 初始化和插入

1
2
3
4
5
6
7
8
9
10
type PersonInfo struct {
ID string
Name string
Address string
}

var personDB map[string]PersonInfo
personDB = make(map[string]PersonInfo)
personDB["12345"] = PersonInfo{"12345", "Tom", "Room 203"}
personDB["1"] = PersonInfo{"1", "Jack", "Room 102"}

可以看到map使用前用make先构造初始化,之后进行了插入,如果key存在,则修改value

map 查找

1
2
3
4
5
6
7
8
//从这个map查找键为"1234"
person, ok := personDB["1234"]
if ok {
fmt.Println("Found person", person.Name, "with ID 1234")
} else {
fmt.Println("Did not find person with ID 1234")
}

查找指定key,返回值为value和bool类型结果,所以先判断bool类型值是否为true

Read more »

Go(05)slice知识介绍和使用

Posted on 2019-05-08 | In golang

golang 的引用类型和内置类型变量

golang 中变量类型分为引用类型和值类型(也叫作内置类型)

1.值类型:变量直接存储值,内存通常在栈中分配。

值类型:基本数据类型int、float、bool、string以及数组和struct

2.引用类型:变量存储的是一个地址,这个地址存储最终的值。内存通常在 堆上分配。通过GC回收。

引用类型:指针、slice、map、chan等都是引用类型。这类型变量需要通过make构造

golang中函数传参只有一种方式

golang中函数传递参数,只有值传递一种,也就是实参内容按照值copy方式传递给形参。
当函数的形参变量类型为指针,slice,map,chan等类型时,虽然实参和形参地址不同,但是内部指向了同一个地址,所以可以达到修改指定空间数据的目的。
不要着急,接下来我会写一写小demo帮助大家理解。

Read more »

Go(04)Cobra命令行参数库的使用

Posted on 2019-04-29 | In golang

下载和安装

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
2
3
4
5
demo
├── cmd
│ └── root.go
├── LICENSE
└── main.go

进去该文件夹,运行:

1
go run main.go
Read more »

Go(03)golang 基本变量和demo

Posted on 2019-04-27 | In golang

本文介绍基本的golang变量和简单的demo,该系列博文由浅入深,带领大家初入golang。

golang 基本类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var v1 int  //整形
var v2 string //字符串
var v3 [10]int //数组
var v4 []int //切片
var v5 struct{ //结构体
f int
}
var v6 * int //指针
var v7 map[string]int //map,key为string,value为int
var v8 func(a int) int //函数对象
var(
v9 int
v10 string
)

如注释所说,上面就是以后会用到的基本类型,切片可以理解为C++的vector,python的list。
可以用括号把两个变量括起来一起定义。

Read more »

eos源码剖析之controller

Posted on 2019-04-09 | In 区块链

controller::block_status,区块状态枚举类,包括:

irreversible = 0,该区块已经被当前节点应用,并且被认为是不可逆的。
validated = 1,这是由一个有效生产者签名的完整区块,并且之前已经被当前节点应用,因此该区块已被验证但未成为不可逆。
complete = 2,这是一个由有效生产者签名的完整区块,但是还没有成为不可逆,也没有被当前节点应用。
incomplete = 3,这是一个未完成的区块,未被生产者签名也没有被某个节点生产。
实际上块的状态就是,1未签名未应用 2已签名未应用 3 已签名和应用,未变成不可逆 4 变成不可逆

controller的私有成员:

apply_context,应用上下文,处理节点应用区块的上下文环境,其中包含了迭代器缓存iterator_cache
transaction_context,事务上下文环境。包括controller,db的session,signed_transaction等。
mutable_db(),返回一个chainbase::database的引用
controller_impl结构体的实例的唯一指针my。controller核心功能都是通过impl实现调用的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct controller_impl {
controller& self;
chainbase::database db; // 用于存储已执行的区块,这些区块可以回滚,一旦提交就成了不可逆的区块
chainbase::database reversible_blocks; ///< a special database to persist blocks that have successfully been applied but are still reversible
block_log blog;
optional<pending_state> pending; // 尚未出的块
block_state_ptr head; // 当前区块的状态
fork_database fork_db; // 用于存储可分叉区块的数据库,可分叉的区块都放到这里
wasm_interface wasmif; // wasm虚拟机的runtime
resource_limits_manager resource_limits; // 资源管理
authorization_manager authorization; // 权限管理
controller::config conf;
chain_id_type chain_id;
bool replaying = false;
bool in_trx_requiring_checks = false; ///< if true, checks that are normally skipped on replay (e.g. auth checks) cannot be skipped
}

controller_impl 几个重要的成员
db用于存储已执行的区块,这些区块可以回滚,一旦提交就不可逆
reversible_blocks用于存储已执行,但是这些区块是可逆的
pending用于存放当前正在生产或者验证(收到)的区块
fork_db用于存放所有区块(包括自己生产和收到的),这些区块链是可分叉的

Read more »

Go(02)windows环境搭建和vscode配置

Posted on 2019-04-01 | In golang

之前讲述过linux环境下Go语言开发环境搭建,这次简述下windows的搭建以及vscode配置

windows环境搭建

同样去https://studygolang.com/dl下载windows环境go安装包
直接下载msi安装

Read more »
<1…262728…37>

370 posts
17 categories
21 tags
RSS
GitHub ZhiHu
© 2025 恋恋风辰 本站总访问量次 | 本站访客数人
Powered by Hexo
|
Theme — NexT.Muse v5.1.3