当前位置: 首页 > article >正文

Golang学习笔记_26——通道

Golang学习笔记_23——error补充
Golang学习笔记_24——泛型
Golang学习笔记_25——协程Golang学习笔记_25——协程


文章目录

    • 通道
      • 1. 创建通道
      • 2. 发送和接收数据
      • 3. 带缓冲的通道
      • 4. Demo
    • 源码


通道

在Go中,协程是通过go关键字来创建的。当你使用go关键字调用一个函数时,该函数会在一个新的协程中执行。

协程的调度由Go运行时(runtime)管理,开发者不需要关心具体的调度细节。

虽然协程可以并发执行,但有时候我们需要在协程之间传递数据或进行同步。在Go中,这是通过通道(Channel)来实现的。

通道是一种类型安全的、多路复用的、在协程之间传递通信的管道。

通道的类型由通道中传递的元素类型决定。例如,chan int是一个可以传递int类型数据的通道。

1. 创建通道

使用make函数创建通道

ch := make(chan int)

2. 发送和接收数据

使用箭头操作符(<-)向通道发送或接收数据

ch <- 42 // 发送数据到通道
value := <- ch  // 从通道中接受数据

3. 带缓冲的通道

// 创建一个缓冲区大小为2的缓冲通道
ch := make(chan int, 1)

4. Demo

import "fmt"

func sum(a []int, c chan int) {
	total := 0

	for _, v := range a {
		total += v
	}
	c <- total // 将计算结果发送到通道

}

func channelDemo() {
	a := []int{7, 2, 8, -9, 4, 0}
	c := make(chan int)
	go sum(a[:len(a)/2], c)
	go sum(a[len(a)/2:], c)

	result1 := <-c
	result2 := <-c
	fmt.Println(result1 + result2)
}

测试方法

func Test_channelDemo(t *testing.T) {
	channelDemo()
}

输出结果

=== RUN   Test_channelDemo
12
--- PASS: Test_channelDemo (0.00s)
PASS

源码

// channel_demo.go 文件
package channel_demo

import "fmt"

func sum(a []int, c chan int) {
	total := 0

	for _, v := range a {
		total += v
	}
	c <- total // 将计算结果发送到通道

}

func channelDemo() {
	a := []int{7, 2, 8, -9, 4, 0}
	c := make(chan int)
	go sum(a[:len(a)/2], c)
	go sum(a[len(a)/2:], c)

	result1 := <-c
	result2 := <-c
	fmt.Println(result1 + result2)
}

// channel_demo_test.go 文件
package channel_demo

import "testing"

func Test_channelDemo(t *testing.T) {
	channelDemo()
}

http://www.kler.cn/a/506615.html

相关文章:

  • 80_Redis内存策略
  • 在 Webpack 中使用 预加载(Preloading) 技术可以通过动态导入(import())以及指定预加载的方式来进行优化
  • 【Unity3D】【已解决】TextMeshPro无法显示中文的解决方法
  • SpringMVC
  • stack_queue的底层,模拟实现,deque和priority_queue详解
  • (三)c#中const、static、readonly的区别
  • 【C++】size_t全面解析与深入拓展
  • ‌如何有效学习PyTorch:从基础到实践的全面指南‌
  • python入门
  • root后如何隐藏环境?
  • LabVIEW驱动电机实现样品自动搜索
  • 从零开始打造AI知识库:使用爬虫自动化采集网页内容的完整教程
  • centos 7 Mysql服务
  • Day09-后端Web实战——部门管理开发Logback日志技术
  • 2025.1.15——六、SQL结构【❤sqlmap❤】
  • 旋转编码器驱动-标准库和HAL库
  • Windows图形界面(GUI)-QT-C/C++ - Qt键盘与鼠标事件处理详解
  • 装饰器模式详解(附代码案例和源码分析)
  • phaserjs+typescript游戏开发之camera实现
  • SQL正则表达式用法大全以及如何利用正则表达式处理复杂数据
  • DCU异构程序--矩阵乘
  • mysql zabbix监控方法
  • JAVA:责任链模式(Chain of Responsibility Pattern)的技术指南
  • 基于springboot的rmi远程调用
  • API调用过程中遇到错误的解决方案
  • 清除前端缓存的方式