今天这篇笔记我们来学习锁:互斥锁(Mutex)和读写锁(RWMutex)互斥锁(Mutex)首先我们来看一段代码,没有加锁的情况下,两个goroutine同时修改一个变量,会发生什么funcmain(){ varcountint increment:=func(){ count++ fmt.Printf("Incrementing:%d\n",count) } decrement:=func(){ count-- fmt.Printf("Decrementing:%d\n",count) } vararithmeticsync.WaitGroup fori:=0;i上面的代码定义了一个
今天这篇笔记我们来学习锁:互斥锁(Mutex)和读写锁(RWMutex)互斥锁(Mutex)首先我们来看一段代码,没有加锁的情况下,两个goroutine同时修改一个变量,会发生什么funcmain(){ varcountint increment:=func(){ count++ fmt.Printf("Incrementing:%d\n",count) } decrement:=func(){ count-- fmt.Printf("Decrementing:%d\n",count) } vararithmeticsync.WaitGroup fori:=0;i上面的代码定义了一个
今天这篇笔记我们来学习一下context包context包的一个应用场景是可以通过它控制goroutine的取消,超时等。我们先来看一个取消的例子context.WithCancelfuncdoSomething(ctxcontext.Context){ ctx,cancelctx:=context.WithCancel(ctx) printCh:=make(chanint) godoAnother(ctx,printCh) fori:=0;i我们在doSomething方法中加了一个可以取消的Context,然后定义了一个channel,往channel里面放入3个数,另外启动一个gorou
今天这篇笔记我们来学习一下context包context包的一个应用场景是可以通过它控制goroutine的取消,超时等。我们先来看一个取消的例子context.WithCancelfuncdoSomething(ctxcontext.Context){ ctx,cancelctx:=context.WithCancel(ctx) printCh:=make(chanint) godoAnother(ctx,printCh) fori:=0;i我们在doSomething方法中加了一个可以取消的Context,然后定义了一个channel,往channel里面放入3个数,另外启动一个gorou
今天这篇笔记我们记录sync包下面的Cond,Once和PoolCondcond就是条件,当条件不满足的时候等待Wait(),条件满足后,继续执行。通过Signal()和Broadcast()来通知wait结束,继续执行。我们先来看一个Signal通知的例子funcmain(){ c:=sync.NewCond(&sync.Mutex{}) queue:=make([]interface{},0,10) removeFromQueue:=func(delaytime.Duration){ time.Sleep(delay) c.L.Lock() queue=queue[1:] fmt.
今天这篇笔记我们记录sync包下面的Cond,Once和PoolCondcond就是条件,当条件不满足的时候等待Wait(),条件满足后,继续执行。通过Signal()和Broadcast()来通知wait结束,继续执行。我们先来看一个Signal通知的例子funcmain(){ c:=sync.NewCond(&sync.Mutex{}) queue:=make([]interface{},0,10) removeFromQueue:=func(delaytime.Duration){ time.Sleep(delay) c.L.Lock() queue=queue[1:] fmt.
今天这篇笔记我们来记录Channel和Select,Go语言并发中Channel是goroutine传递数据的桥梁,是非常重要的一个工具。定义Channel双向Channel要定义一个channel很简单,只需要在类型前面加上chan就可以了,stringStream:=make(chanstring)这样就是定义和实例化了一个string类型的双向channel,先来看一个HelloWorld的例子funcmain(){ stringStream:=make(chanstring) gofunc(){ stringStream运行代码控制台打印出“Hellochannels”,这个简单的例
今天这篇笔记我们来记录Channel和Select,Go语言并发中Channel是goroutine传递数据的桥梁,是非常重要的一个工具。定义Channel双向Channel要定义一个channel很简单,只需要在类型前面加上chan就可以了,stringStream:=make(chanstring)这样就是定义和实例化了一个string类型的双向channel,先来看一个HelloWorld的例子funcmain(){ stringStream:=make(chanstring) gofunc(){ stringStream运行代码控制台打印出“Hellochannels”,这个简单的例
今天这篇笔记我们来学习Go限流限流是分布式系统中经常需要用到的技术,因为我们让请求没有限制,很容易就出现某个用户开很多线程把我们的服务拉跨,进而影响到别的用户。限流我们来看下Go语言层面可以怎么做到限流,先看一段不限流的代码,typeAPIConnectionstruct{}funcOpen()*APIConnection{ return&APIConnection{}}func(a*APIConnection)ReadFile(ctxcontext.Context)error{//假装我们在这里有运行 returnnil}func(a*APIConnection)ResolveAddress
今天这篇笔记我们来学习Go限流限流是分布式系统中经常需要用到的技术,因为我们让请求没有限制,很容易就出现某个用户开很多线程把我们的服务拉跨,进而影响到别的用户。限流我们来看下Go语言层面可以怎么做到限流,先看一段不限流的代码,typeAPIConnectionstruct{}funcOpen()*APIConnection{ return&APIConnection{}}func(a*APIConnection)ReadFile(ctxcontext.Context)error{//假装我们在这里有运行 returnnil}func(a*APIConnection)ResolveAddress