go语言怎么 控制一个变量输入的范围_Go语言的并发,你做对了吗?

ac3afacb544be4a5144584d3cad7b55b.gif

Go语言的并发,你做对了吗?

并发性是go语言一个非常核心的卖点。这一期我们就来看一下,Go语言的并发性。

dbf6fd90abde15267929d87f5bf5d66c.png

[go routines]

首先来看一下goroutines。Go routine是一个轻量级的线程。

启动方式,就用go关键字

go f(x)

Go routines跑在同一样的地址空间, 所以在访问共享内存变量的时候一定要注意同步的问题。

[channels]

channels直译过来就是管道,用起来也像管道。你可以通过管道来发送或者传输数据。

运算符是小于号减<-。

ch <- v

上面这个表示发送变量v中的数据到管道 ch。

v:=<- ch

上面这个则表示从管道ch中获取数据并存放给变量v。

小于号相当于箭头,这个箭头的指向就是数据的流向。

创建一个管道的方式用make(chan int).

缺省的,发送和接收动作会等待另一端准备好以后才进行。够语言,这么设计的目的,就是为了防止使用一些显性的锁和条件变量来实现同步处理, 从而可以简化代码的设计。

[buffered channel]

buffered channels 即缓冲管道。在创建管道的时候,输入第2个参数即缓冲的长度来创建一个缓冲管道

make(chan int, 10).

缓冲管道的特点是这样子的:

只有当缓冲满了的时候,发送才会开始。

只有当缓冲有空的时候,接收才会开始。

当缓冲满了还要往里添加的话,就会形成死锁错误。

[close channel]

此外管道还可以被关闭。只有管道的发送方才可以关闭管道, 关闭的方法就是close(ch)。管道关闭以后,就没有值再发出来了。接收者在接收数据的时候可以传入第2个参数来测试管道是否关闭。

v, ok := <-ch

可以用for循环来连续的从一个管道中获取数据。

for i:=range c

关闭管道的主要用途就是为了告诉接收方,没有后续数据再进来了。这样接收方可以关掉接收管道数据的程序。

[select]

Select 和 case用来选择哪一个goroutine可以运行。感觉上这一个跟switch case有点相像。

还可以指定一个缺省的选项,在没有任何指定选项符合条件的情况下可以运行这个缺省选项。

[Mutex]

最后我们来看一下go语言里面的互斥。当我们允许同时只有一个goroutine访问一个变量的时候,我们就需要使用互斥机制。使用互斥,就是调用他的两个方法 lock和unlock。

这里值得一提的是,在一些函数中使用了互斥锁从而获取数据,我们可以用defer来保证释放一个互斥锁,然后再直接返回数据。

以上这些就是go语言里面的并发机制了。

aa3813dd3e835ed6863b939efdfae38e.png

这一期就说这些,希望对大家有所帮助。

这里是丁哥开讲,欢迎关注防止失联。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值