单向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…
go多接口实现
对于一个结构体来说,可以通过同时实现多个接口的方法来实现多个接口,例如:type Writer interface { Write() } type Closer interface { Close() } type WriteCloser struct{} func (wc *WriteCloser) Write() { fmt.Println(…
panic,recover介绍和使用
在go中,使用panic来抛出一个错误并将程序停止。一般有主动panic和被动panic两种情况。对于主动panic,可以是当一个程序启动时如果需要的依赖程序没有启动就将这个启动停掉,比如没有开etcd或mysql等,例如:func main() { ismysql := false; // 模拟mysql未启动的场景 if !ismysql { …