网站首页 返回列表 像“草根”一样,紧贴着地面,低调的存在,冬去春来,枯荣无恙。

golang 基础(23)channel

2020-06-10 02:47:52 admin 1820

golang_real.jpg

goroutine 也就是协程间通讯是通过 channel 来实现的,channel 将信息从一个 goroutine 传递到给另一个 gorout。

golang_channel.jpg

__

  1. func main(){
  2. messages := make(chan string)
  3. go func(){messages <- "ping"}()
  4. msg := <- messages
  5. fmt.Println(msg)
  6. }

这里大家可能会有些疑惑,不过我告诉大家其实 main 本身也是一个 goroutine 大家就明白这个例子了吧。定义 channel 很简单我们,
make(chan 传递数据类型)

__

  1. messages := make(chan int8)
  2. go func(){messages <- 30}()

当然也可以传递一些结构体作为传递信息的类型。

__

  1. type Email struct{
  2. title string
  3. body string
  4. }
  5. func main(){
  6. messages := make(chan Email)
  7. aEmail := Email{
  8. title:"angular",
  9. body:"angular content",
  10. }
  11. go func(){messages <- aEmail
  12. }()
  13. msg := <- messages
  14. fmt.Println(msg.title)
  15. }

channel 有两种类型

  • Unbuffered channel
  • buffered channel
    之前我们介绍实例中都使用的是 Unbuffered channel

在一个 unbuffered channel 上执行 send 操作会阻塞当前的 goroutine 直到另一个 goroutine 对

这个 channel 执行 receive 操作,此时发送的 value 通过 channel 进行传递,两个 goroutine
继续后续的执行。相反如果是 receive 操作先执行,则 receive 的 goroutine 阻塞直到有另一个 goroutine 对 channel
执行 send 操作。

__

  1. func main() {
  2. messages := make(chan string, 2)
  3. messages <- "buffered"
  4. messages <- "channel"
  5. fmt.Println(<-messages)
  6. fmt.Println(<-messages)
  7. }

Golang_cyan.png

转载文章,原文链接: golang 基础(23)channel

关键字词golangchannel

分享到:

如需留言,请 登录,没有账号?请 注册

0 条评论 0 人参与

顶部 底部