11 2022 档案
摘要:今天这篇笔记我们来学习Go 限流 限流是分布式系统中经常需要用到的技术,因为我们让请求没有限制,很容易就出现某个用户开很多线程把我们的服务拉跨,进而影响到别的用户。 限流 我们来看下Go语言层面可以怎么做到限流,先看一段不限流的代码, type APIConnection struct{} func
阅读全文
摘要:今天这篇笔记我们来学习一下context包 context包的一个应用场景是可以通过它控制goroutine的取消,超时等。 我们先来看一个取消的例子 context.WithCancel func doSomething(ctx context.Context) { ctx, cancelctx
阅读全文
摘要:今天这篇笔记我们来记录Channel 和 Select, Go语言并发中Channel是goroutine传递数据的桥梁,是非常重要的一个工具。 定义Channel 双向Channel 要定义一个channel很简单,只需要在类型前面加上chan就可以了, stringStream := make(
阅读全文
摘要:今天这篇笔记我们记录sync包下面的Cond,Once和Pool Cond cond就是条件,当条件不满足的时候等待Wait(),条件满足后,继续执行。 通过Signal()和Broadcast()来通知wait结束,继续执行。我们先来看一个Signal通知的例子 func main() { c :
阅读全文
摘要:今天这篇笔记我们来学习锁:互斥锁(Mutex) 和 读写锁(RWMutex) 互斥锁(Mutex) 首先我们来看一段代码,没有加锁的情况下,两个goroutine同时修改一个变量,会发生什么 func main() { var count int increment := func() { coun
阅读全文
摘要:今天这篇笔记重点讲goroutine 首先怎么定义goroutine 很简单,在方法前面加上go就可以了 func main() { go sayHello() } func sayHello() { fmt.Println("hello") } 也可以直接这样写, 基于匿名函数 go func()
阅读全文
摘要:已经把《Go 语言并发之道》通读了一遍,非常不错的一本书,对于理解掌握Go语言的并发知识有很大的帮助,接下来我会把书中有用的知识通过代码示例出来,把一些比较好的知识点记录下来。 首先我们来看一段代码 var data int go func() { data++ }() if data == 0 {
阅读全文
摘要:二叉树是比较基础的数据结构,以前也知道,但是一直没有细究,不明白它究竟有什么作用,这次学习数据结构,结合Go语言来动手实践一个,只有动手做一做对它的理解才比较深一点。 二叉树的定义 首先是二叉树的定义,二叉树顾名思义有两个叉,左右各一个,最多两个。 根节点 关于根节点,起初我还以为二叉树的根节点会变
阅读全文