深入浅出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
      }
   }
}
相关文章
|
1天前
|
设计模式 Go 调度
Golang深入浅出之-Go语言中的并发模式:Pipeline、Worker Pool等
【5月更文挑战第1天】Go语言并发模拟能力强大,Pipeline和Worker Pool是常用设计模式。Pipeline通过多阶段处理实现高效并行,常见问题包括数据竞争和死锁,可借助通道和`select`避免。Worker Pool控制并发数,防止资源消耗,需注意任务分配不均和goroutine泄露,使用缓冲通道和`sync.WaitGroup`解决。理解和实践这些模式是提升Go并发性能的关键。
12 2
|
1天前
|
JSON 监控 安全
Golang深入浅出之-Go语言中的反射(reflect):原理与实战应用
【5月更文挑战第1天】Go语言的反射允许运行时检查和修改结构,主要通过`reflect`包的`Type`和`Value`实现。然而,滥用反射可能导致代码复杂和性能下降。要安全使用,应注意避免过度使用,始终进行类型检查,并尊重封装。反射的应用包括动态接口实现、JSON序列化和元编程。理解反射原理并谨慎使用是关键,应尽量保持代码静态类型。
10 2
|
1天前
|
Go
Golang深入浅出之-Go语言代码质量与规范:遵循Gofmt与Linting
【5月更文挑战第1天】本文讨论了如何使用`gofmt`和Lint工具提升Go代码质量。`gofmt`负责自动格式化代码,保持风格统一,而Lint工具如`golint`、`govet`、`staticcheck`则进行静态分析,检查潜在错误和未使用的变量。通过集成`gofmt`检查到CI/CD流程,避免格式冲突,并使用Lint工具发现并修复问题,如未处理的错误、不规范命名。遵循这些最佳实践,可提高代码可读性、团队协作效率和可维护性。
9 3
|
2天前
|
JSON 安全 Java
2024年的选择:为什么Go可能是理想的后端语言
【4月更文挑战第27天】Go语言在2024年成为后端开发的热门选择,其简洁设计、内置并发原语和强大工具链备受青睐。文章探讨了Go的设计哲学,如静态类型、垃圾回收和CSP并发模型,并介绍了使用Gin和Echo框架构建Web服务。Go的并发通过goroutines和channels实现,静态类型确保代码稳定性和安全性,快速编译速度利于迭代。Go广泛应用在云计算、微服务等领域,拥有丰富的生态系统和活跃社区,适合作为应对未来技术趋势的语言。
8 0
|
2天前
|
Go 开发者
Golang深入浅出之-Go语言项目构建工具:Makefile与go build
【4月更文挑战第27天】本文探讨了Go语言项目的构建方法,包括`go build`基本命令行工具和更灵活的`Makefile`自动化脚本。`go build`适合简单项目,能直接编译Go源码,但依赖管理可能混乱。通过设置`GOOS`和`GOARCH`可进行跨平台编译。`Makefile`适用于复杂构建流程,能定义多步骤任务,但编写较复杂。在选择构建方式时,应根据项目需求权衡,从`go build`起步,逐渐过渡到Makefile以实现更高效自动化。
10 2
|
2天前
|
存储 Go
Golang深入浅出之-Go语言依赖管理:GOPATH与Go Modules
【4月更文挑战第27天】Go语言依赖管理从`GOPATH`进化到Go Modules。`GOPATH`时代,项目结构混乱,可通过设置多个工作空间管理。Go Modules自Go 1.11起提供更现代的管理方式,通过`go.mod`文件控制依赖。常见问题包括忘记更新`go.mod`、处理本地依赖和模块私有化,可使用`go mod tidy`、`replace`语句和`go mod vendor`解决。理解并掌握Go Modules对现代Go开发至关重要。
8 2
|
2天前
|
安全 测试技术 Go
Golang深入浅出之-Go语言单元测试与基准测试:testing包详解
【4月更文挑战第27天】Go语言的`testing`包是单元测试和基准测试的核心,简化了测试流程并鼓励编写高质量测试代码。本文介绍了测试文件命名规范、常用断言方法,以及如何进行基准测试。同时,讨论了测试中常见的问题,如状态干扰、并发同步、依赖外部服务和测试覆盖率低,并提出了相应的避免策略,包括使用`t.Cleanup`、`t.Parallel()`、模拟对象和检查覆盖率。良好的测试实践能提升代码质量和项目稳定性。
8 1
|
2天前
|
运维 监控 Go
Golang深入浅出之-Go语言中的日志记录:log与logrus库
【4月更文挑战第27天】本文比较了Go语言中标准库`log`与第三方库`logrus`的日志功能。`log`简单但不支持日志级别配置和多样化格式,而`logrus`提供更丰富的功能,如日志级别控制、自定义格式和钩子。文章指出了使用`logrus`时可能遇到的问题,如全局logger滥用、日志级别设置不当和过度依赖字段,并给出了避免错误的建议,强调理解日志级别、合理利用结构化日志、模块化日志管理和定期审查日志配置的重要性。通过这些实践,开发者能提高应用监控和故障排查能力。
8 1
|
2天前
|
安全 Go
Golang深入浅出之-Go语言标准库中的文件读写:io/ioutil包
【4月更文挑战第27天】Go语言的`io/ioutil`包提供简单文件读写,适合小文件操作。本文聚焦`ReadFile`和`WriteFile`函数,讨论错误处理、文件权限、大文件处理和编码问题。避免错误的关键在于检查错误、设置合适权限、采用流式读写及处理编码。遵循这些最佳实践能提升代码稳定性。
6 0
|
2天前
|
Go C++
go 语言回调函数和闭包
go 语言回调函数和闭包