这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
本篇文章主要是收集了笔者在学习今天的课程,以及go语言的一些难点时,所总结出来的注意点。
Go语言进阶注意点
并发编程
go中的协程(goroutine)
在学习java时,我们了解到了java中的线程,并且明白多个线程可以在一个进程中执行,并且符合并发要求,使得java的并发式编程有了可能。而现在,go语言中,我们又可以学习另外一种,协程(coroutine),在go中应用后,被称为goroutine。类似于在java中我们可以把线程看成是超小型进程,我们在go中也可以把协程看成是超小型线程。
协程的效率很高,而且拥有许多像线程一样的特性。一般来说,可以轻松并发地执行上万个协程而不卡顿。
在go语言中协程的简单定义:
//先创建出要执行的任务,语法同一般函数
func newTask() {
for{
...//do
time.Sleep(time.Second*1) //延时一秒
}
}
而要执行任务,则只需要用“go”去运行即可。
go newTask()
通道(channel)
在go中,如果要实现并发设计的话,除了使用上面讲述的协程外,还可以使用另外的方式:通道/管道,即channel。 channel通常是作为引用类型来使用,且用于给多个goroutine通讯。
- 通道的分类:
channel根据其是否能承载缓冲量,可以分为无缓冲channel与有缓冲channel两种,在go中定义方式分别为:
make(chan Type) //无缓冲
make(chan Type, capacity) //有缓冲
当然,当可承载缓冲量为0时,有缓冲channel也就是无缓冲channel了,即:
make(chan Type,0) //相当于make(chan Type)
- 通道的操作:
对于一个通道,对其的操作有发送和接受两种,都用<-表示。
发送value到channel中:
channel <- value
将channel中的数据输出并赋值给value:
value <- channel
-
通道的另外一种分类:
-
双向通道
根据其能否同时发送和接收数据,可以分为单向通道和双向通道。一般来说,通道都是双向通道。这里就不再赘述。定义方法:
var temp chan int //能发送和接收int数据的双向通道 -
单向通道
当只需要发送数据或者接收数据时,可以考虑使用单向通道。在go语言中的定义方法为:
var temp1 <-chan int //只能输出int数据的单向通道 var temp2 chan<- int //只能输入int数据的单向通道
-