深入浅出Go语言通道chan类型

举报
海风极客 发表于 2022/11/27 21:32:32 2022/11/27
【摘要】 首先引用一句名言:Don’t communicate by sharing memory; share memory by communicating.(不要通过共享内存来通信,而应该通过通信来共享内存。)-Rob Pike我是这样理解的: 1 简介通道(chan)类似于一个队列,特性就是先进先出,多用于goruntine之间的通信声明方式:ch := make(chan int)放入元素:...

首先引用一句名言:

Don’t communicate by sharing memory; share memory by communicating.

(不要通过共享内存来通信,而应该通过通信来共享内存。)-Rob Pike

我是这样理解的:
在这里插入图片描述

1 简介

通道(chan)类似于一个队列,特性就是先进先出,多用于goruntine之间的通信

声明方式:

ch := make(chan int)

放入元素:

ch <- 0

取出元素:

elem1 := <-ch

遍历元素:

for data := range ch {
   ...
}

2 最基本使用

func chanPlay01() {
   //声明一个chan,设置长度为3
   ch1 := make(chan int, 3)
   //进channel
   ch1 <- 2
   ch1 <- 1
   ch1 <- 3
   //出channel
   elem1 := <-ch1
   elem2 := <-ch1
   elem3 := <-ch1
   //打印通道的值
   fmt.Printf("The first element received from channel ch1: %v\n", elem1)
   fmt.Printf("The first element received from channel ch1: %v\n", elem2)
   fmt.Printf("The first element received from channel ch1: %v\n", elem3)
   //关闭通道
   close(ch1)
}

3 引入panic()方法

func chanPlay03() {
   //声明一个chan,设置长度为3
   ch1 := make(chan int, 2)
   //进channel
   ch1 <- 2
   ch1 <- 1
   ch1 <- 3
   //出channel
   elem1 := <-ch1
   elem2 := <-ch1
   elem3 := <-ch1
   //打印通道的值
   fmt.Printf("The first element received from channel ch1: %v\n", elem1)
   fmt.Printf("The first element received from channel ch1: %v\n", elem2)
   //panic内置函数停止当前线程的正常执行goroutine
   panic(ch1)
   fmt.Printf("The first element received from channel ch1: %v\n", elem3)
   //关闭通道
   close(ch1)
}

4 不同协程间通信

func main() {
   // 构建一个通道
   ch := make(chan int)
   // 开启一个并发匿名函数
   go func() {
      // 从3循环到0
      for i := 3; i >= 0; i-- {
         // 发送3到0之间的数值
         ch <- i
         // 每次发送完时等待
         time.Sleep(time.Second)
      }
   }()
   // 遍历接收通道数据
   for data := range ch {
      // 打印通道数据
      fmt.Println(data)
      // 当遇到数据0时, 退出接收循环
      if data == 0 {
         break
      }
   }
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。