go观察者模式

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172package mainimport "fmt"func main()...

阅读全文

dfs之查找二叉树最大深度

传送到leetcode: leetcode-104 123456789101112131415161718192021222324252627282930313233/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *...

阅读全文

go实现lru

原理:定义lru结构的时候主要包含一个哈希表和双向链表,哈希表便于获取指定key的数据(复杂度O(1)),把每次热点数据都更新到表头,则从表头到表尾访问热度依次递减,溢出的时候直接删除表尾数据即可。 go代码实现: 12345678910111213141516171819202122232425262728293031323334353637383940...

阅读全文

go容易忽视的黑坑系列2

推断下面代码输出结果:12345678910111213141516var f = func(i int) { fmt.Println("x")}func main(){ f := func(i int) { println(i) if i > 0 { f(i-1) &#...

阅读全文

N皇后问题

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889// 是否冲突// ...

阅读全文

goroutine池简单实现

不可复用的简单实现其实就是基于有缓冲channel的特性,每创建一个goroutine就向goroutine里面发送一个数据,goroutine任务完成之后就消费一条channel里面的数据,当channel满了之后就阻塞。 123456789101112131415161718192021222324func main() { // 最多50个g...

阅读全文

go容易忽视的黑坑系列1

先看下面代码,是否有问题。 1234567func main(){ const sh = "zhang" fmt.Println(&sh, sh) var nl string = "san" fmt.Println(&nl, nl)} 运行结果: 123☁ te...

阅读全文

二叉搜索树插入于删除操作

概念二叉排序树(Binary Sarech/Sort Tree)或者是一颗空树;或者是具有如下性质的二叉树: (1) 若它的左子树不空,则 左子树 上所有结点的值 均小于 它的根结点的值;(2) 若它的右子树不空,则 右子树 上所有结点的值 均大于 它的根结点的值;(3) 它的 左、右子树又分别为二叉排序树 。 比如一下值: 8、3、10、1、...

阅读全文

二叉树遍历

方式概念 前序遍历:递归遍历根->左->右 中序遍历:递归遍历左->根->右 后续遍历:递归遍历左->右->中 层序遍历:由根节点开始一层层的遍历 其实前序遍历、中序遍历、后序遍历里面的前、中、后指的是根结点的位置。以下面这棵树来举例说明。 存储结构12345type Node struct { Valu...

阅读全文

分布式锁方案对比

分布式锁当我们对一份数据进行修改的时候需要先读取,再修改,由于读取和修改不是原子操作,在并发的情况下,无法保证前后数据是一致的,在单点服务中我们可以使用本地锁来实现(比如:sync.Mutex),但是对于分布式系统服务,本地锁却无能为力。这时候就需要使用分布式锁来保证数据的一致性。 很多应用场景是需要系统保证幂等性的(如api服务或消息消费者),并发情况下...

阅读全文