1.什么是协程?
Go 协程是与其他函数或方法一起并发运行的函数或方法。Go 协程可以看作是轻量级线程。与线程相比,创建一个 Go 协程的成本很小。因此在 Go 应用中,常常会看到有数以千计的 Go 协程并发地运行。
package main
import (
"fmt"
"time"
)
func hello() {
fmt.Println("Hello world goroutine")
}
func main() {
go hello()
time.Sleep(1 * time.Second)
fmt.Println("main function")
}
这里的使用关键字go开启一个协程,并发进行,类似与java中开启一个新的线程
2.聊聊go的信道
通道是干嘛的呢,简单来说就是传输数据用的,实现协程之间的通信,就像一个水管子,我供水,你接水。这里呢就是传输数据用到的
来看一个案例
package main
import (
"fmt"
)
func hello(done chan bool) {
fmt.Println("Hello world goroutine")
done <- true
}
func main() {
done := make(chan bool)
go hello(done)
<-done
fmt.Println("main function")
}
首先在main方法中,定义了一个bool类型的信道done,用来做标记,用go启动一个hello协程,然后在<-done阻塞,等待done中有数据传入,在hello方法中打印完语句后,给done传入true值,阻塞结束,输出"main function".
总结一下呢,就是协程就是类似于线程,通道就是用于协程之间的通信。
一开始比较难理解的呢,就是chan的阻塞,信道的发送与接收都是阻塞的。这是什么意思?当把数据发送到信道时,程序控制会在发送数据的语句处发生阻塞,直到有其它 Go 协程从信道读取到数据,才会解除阻塞。与此类似,当读取信道的数据时,如果没有其它的协程把数据写入到这个信道,那么读取过程就会一直阻塞着。