今天这篇笔记重点讲goroutine首先怎么定义goroutine很简单,在方法前面加上go就可以了funcmain(){ gosayHello()}funcsayHello(){ fmt.Println("hello")}也可以直接这样写,基于匿名函数gofunc(){ fmt.Println("hello")}()go语言至少有一个maingoroutine,另外调用的sayhellogoroutine和maingoroutine并发执行,会在maingoroutine退出后退出,所以我们上面的代码是有问题的,它不会打印出"hello".因为maingoroutine退出了,它没有机会执行
已经把《Go语言并发之道》通读了一遍,非常不错的一本书,对于理解掌握Go语言的并发知识有很大的帮助,接下来我会把书中有用的知识通过代码示例出来,把一些比较好的知识点记录下来。首先我们来看一段代码vardataintgofunc(){data++}()ifdata==0{ fmt.Println("thevalueis0.")}else{ fmt.Printf("thevalueis%v.\n",data)}这段代码我们想把data+1后打印出来,但是结果打印出来的效果是“thevalueis0.”,没有达到我们的预期,主要是因为调用data++的这个goroutine没有先执行。并发的难点就是
今天这篇笔记重点讲goroutine首先怎么定义goroutine很简单,在方法前面加上go就可以了funcmain(){ gosayHello()}funcsayHello(){ fmt.Println("hello")}也可以直接这样写,基于匿名函数gofunc(){ fmt.Println("hello")}()go语言至少有一个maingoroutine,另外调用的sayhellogoroutine和maingoroutine并发执行,会在maingoroutine退出后退出,所以我们上面的代码是有问题的,它不会打印出"hello".因为maingoroutine退出了,它没有机会执行
已经把《Go语言并发之道》通读了一遍,非常不错的一本书,对于理解掌握Go语言的并发知识有很大的帮助,接下来我会把书中有用的知识通过代码示例出来,把一些比较好的知识点记录下来。首先我们来看一段代码vardataintgofunc(){data++}()ifdata==0{ fmt.Println("thevalueis0.")}else{ fmt.Printf("thevalueis%v.\n",data)}这段代码我们想把data+1后打印出来,但是结果打印出来的效果是“thevalueis0.”,没有达到我们的预期,主要是因为调用data++的这个goroutine没有先执行。并发的难点就是
今天这篇笔记我们来学习锁:互斥锁(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.