分类: Go

32 篇文章

通过context解决goroutine的信息传递
假如有一个方法一直在打印提示信息,现在想要在main方法中经过一段的时间主动的去停止,这个时候我们可以选择使用共享变量的方式(注意加读写锁),也可以使用channel的方式。例如:共享变量:var stop bool var rwlock sync.RWMutex var wg sync.WaitGroup func g1() { for { rw…
select完成对多个channel监控
假如现在有两个方法,分别有对应的channel,每当他们运行完成之后会向channel中发送一个信号。现在想要知道是哪一个方法先完成,可以如何做?此时可以使用select方法,来对channel进行监控。select的语法和switch很像,例如:func g1(ch chan struct{}) { time.Sleep(time.Second)…
单向channel
channel如果直接定义一般都是双向的,即我们既可以往里面写值,也可以从里面读值。但是有的时候我们希望某一个方法里面只能是读值,不能写值、或者是只能够写值,不能够读值,此时就需要用到单项channel。单向channel的定义和双向channel差不多,只是多了一个 <- 来标识是单向写入还是单向取出var ch1 chan<- in…
使用close()关闭channel
对于channel来说可以使用for range语法来不断地读值,但是如果当全部值已经读取完毕之后,for range就会阻塞。这个时候我们可以使用close(),来手动的关闭channel,此时for range就会退出了。例如:func main() { var msg chan int var wg sync.WaitGroup wg.Add…
go通过channel进行goroutine之间的通信
在go语言中,两个协程之间进行通信,使用的是一种消息队列的形式。消息的生产者将消息放入消息队列,然后消费者从消息队列中获取消息。go提供了一个数据类型和语法糖来完成这种操作 channel 、 <- 例如:func main() { var msg chan string msg = make(chan string, 1) msg <…
go中RWMutex读写锁介绍
读写锁,RWMuex常用的有四个方法 Lock(), RLock(), Unlock(),RUnlock(),分别是加写锁,加读锁,释放写锁以及释放读锁对于写锁来说,会阻塞其他的写锁和读锁对于读锁来说,不会阻塞读锁(可以同时有多个读锁存在),但是会阻塞写锁同时因为读锁可以有多个,所以当存在一个读和写的goroutine时,写的协程只能等全部的读锁被…
go中atomic包原子化加减操作
对于假如说现在有一个公共的变量var count int同时有两个方法Add() 和 Sub() Add方法可以将count加10000次,Sub方法可以将count减10000次。这个问题来说,除了使用mutex之外也可以使用atomic包中的Addint32()方法来实现。例如:var count int32 var wg sync.WaitG…
go中mutex的使用
假如说现在有一个公共的变量var count int同时有两个方法Add() 和 Sub() Add方法可以将count加10000次,Sub方法可以将count减10000次。现在同时启动两个goroutine来运行这两个方法例如:var count int var wg sync.WaitGroup func add() { defer wg.…
go通过waitgroup等待协程的执行
在go中假如我起了一个goroutine,在主协程中为了让子协程运行完,可以使用 time.Sleep 的方式,主动的等到子协程运行完之后再退出。但是假如我不知道这个子协程运行的具体时间,这个时候为了让主协程可以等待协程运行完之后退出可以使用 sync.WaitGroup 。sync.WaitGroup 提供了三个方法:Add(), Done(),…
通过interface解决动态类型传参
在go语言中,interface{}类型可以接收任意值,根据这个特性,可以完成动态类型传参,例如:func add(a, b interface{}) interface{} { switch a.(type) { case int: ai, _ := a.(int) bi, _ := b.(int) return ai + bi case flo…