![](https://img.haomeiwen.com/i8207483/659e64f6f71b221d.jpg)
goroutine 也就是协程间通讯是通过 channel 来实现的,channel 将信息从一个 goroutine 传递到给另一个 gorout。
![](https://img.haomeiwen.com/i8207483/cfcc6665fee4be67.jpg)
func main(){
messages := make(chan string)
go func(){messages <- "ping"}()
msg := <- messages
fmt.Println(msg)
}
这里大家可能会有些疑惑,不过我告诉大家其实 main 本身也是一个 goroutine 大家就明白这个例子了吧。定义 channel 很简单我们, make(chan 传递数据类型)
messages := make(chan int8)
go func(){messages <- 30}()
当然也可以传递一些结构体作为传递信息的类型。
type Email struct{
title string
body string
}
func main(){
messages := make(chan Email)
aEmail := Email{
title:"angular",
body:"angular content",
}
go func(){messages <- aEmail
}()
msg := <- messages
fmt.Println(msg.title)
}
channel 有两种类型
- Unbuffered channel
- buffered channel
之前我们介绍实例中都使用的是 Unbuffered channel
在一个 unbuffered channel 上执行 send 操作会阻塞当前的 goroutine 直到另一个 goroutine 对
这个 channel 执行 receive 操作,此时发送的 value 通过 channel 进行传递,两个 goroutine 继续后续的执行。相反如果是 receive 操作先执行,则 receive 的 goroutine 阻塞直到有另一个 goroutine 对 channel 执行 send 操作。
func main(){
messages := make(chan string, 2)
messages <- "buffered"
messages <- "channel"
fmt.Println(<-messages)
fmt.Println(<-messages)
}
![](https://img.haomeiwen.com/i8207483/bc9dd536dc3c569f.png)
网友评论