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

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

首先引用一句名言:

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

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

我是这样理解的:

image.png

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
      }
   }
}
相关文章
|
3天前
|
存储 Go 容器
深入探究Go语言中的数据结构
深入探究Go语言中的数据结构
12 3
|
13天前
|
Go
Go 语言循环语句
在不少实际问题中有许多具有规律性的重复操作,因此在程序中就需要重复执行某些语句。
24 1
|
2天前
|
Go
GO语言时间转换
GO语言时间转换
9 0
|
3天前
|
Go
Go 遍历通道与关闭通道
Go 通过 range 关键字来实现遍历读取到的数据
11 0
Go 遍历通道与关闭通道
|
13天前
|
Go 开发者
探索Go语言的并发之美
在Go语言的世界里,"并发"不仅仅是一个特性,它是一种哲学。本文将带你领略Go语言中goroutine和channel的魔力,揭示如何通过Go的并发机制来构建高效、可靠的系统。我们将通过一个简单的示例,展示如何利用Go的并发特性来解决实际问题,让你的程序像Go一样,轻盈而强大。
|
14天前
|
JSON Go API
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
|
14天前
|
Go
go语言创建字典
go语言创建字典
|
14天前
|
NoSQL Go API
go语言操作Redis
go语言操作Redis
|
14天前
|
Unix Go
go语言获取当前时间戳
go语言获取当前时间戳
|
13天前
|
Go
Go 语言接口
Go 语言提供了另外一种数据类型即接口,它把所有的具有共性的方法定义在一起,任何其他类型只要实现了这些方法就是实现了这个接口。 接口可以让我们将不同的类型绑定到一组公共的方法上,从而实现多态和灵活的设计。
10 0