Golang学习笔记_26——通道

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


文章目录

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

通道

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

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

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

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

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

1. 创建通道

使用make函数创建通道

go 复制代码
ch := make(chan int)

2. 发送和接收数据

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

go 复制代码
ch <- 42 // 发送数据到通道
value := <- ch  // 从通道中接受数据

3. 带缓冲的通道

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

4. Demo

go 复制代码
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)
}

测试方法

go 复制代码
func Test_channelDemo(t *testing.T) {
	channelDemo()
}

输出结果

复制代码
=== RUN   Test_channelDemo
12
--- PASS: Test_channelDemo (0.00s)
PASS

源码

go 复制代码
// 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)
}
go 复制代码
// channel_demo_test.go 文件
package channel_demo

import "testing"

func Test_channelDemo(t *testing.T) {
	channelDemo()
}
相关推荐
小狗爱吃黄桃罐头19 分钟前
正点原子【第四期】Linux之驱动开发学习笔记-10.1 Linux 内核定时器实验
linux·驱动开发·学习
卡提西亚20 分钟前
一本通网站1122题:计算鞍点
c++·笔记·编程题·一本通
im_AMBER27 分钟前
Leetcode 47
数据结构·c++·笔记·学习·算法·leetcode
BreezeJuvenile1 小时前
外设模块学习(17)——5V继电器模块(STM32)
stm32·单片机·嵌入式硬件·学习·5v继电器模块
一个数据大开发1 小时前
【零基础一站式指南】Conda 学习环境准备与 Jupyter/PyCharm 完全配置
学习·jupyter·conda
希露菲叶特格雷拉特2 小时前
PyTorch深度学习笔记(二十)(模型验证测试)
人工智能·pytorch·笔记
lingggggaaaa4 小时前
小迪安全v2023学习笔记(一百四十五讲)—— Webshell篇&魔改冰蝎&打乱特征指纹&新增加密协议&过后门查杀&过流量识别
笔记·学习·安全·魔改冰蝎·免杀对抗·免杀技术
Digitally4 小时前
如何将iPhone上的笔记传输到电脑
笔记·电脑·iphone
落羽的落羽4 小时前
【C++】现代C++的新特性constexpr,及其在C++14、C++17、C++20中的进化
linux·c++·人工智能·学习·机器学习·c++20·c++40周年
小苏兮4 小时前
【把Linux“聊”明白】编译器gcc/g++与调试器gdb/cgdb:从编译原理到高效调试
java·linux·运维·学习·1024程序员节