首页 > 其他分享 >Go 语言的Channel

Go 语言的Channel

时间:2024-10-31 14:32:24浏览次数:1  
标签:ch 语言 int make Goroutine chan Go Channel

在 Go 语言中,Channel 是一种用于在多个 Goroutine 之间传递数据的通信机制。
Channel 提供了类型安全、同步的数据传输方式,使 Goroutine 可以相互通信而无需使用锁。

1. Channel 的定义与声明

在 Go 中,可以使用 make 函数创建 Channel,并指定 Channel 中传输的数据类型:

ch := make(chan int)  // 创建一个传递 `int` 类型数据的 Channel

chan 关键字用于声明 Channel。创建时指定的数据类型定义了这个 Channel 只能传输该类型的数据。
例如,chan int 表示该 Channel 只能传递 int 类型的数据。

2. Channel 的基本操作

Channel 的操作包括 发送接收 两种方式:

  • 发送ch <- value,将数据发送到 Channel 中。
  • 接收value := <-ch,从 Channel 接收数据,并赋值给 value

示例:发送和接收

package main

import "fmt"

func main() {
    ch := make(chan int)  // 创建一个整型 Channel

    go func() {
        ch <- 42  // 将数据发送到 Channel
    }()

    value := <-ch  // 从 Channel 接收数据
    fmt.Println(value)  // 输出:42
}

在上面的代码中,主 Goroutine 启动了一个新的 Goroutine,将数据 42 发送到 Channel ch 中。主 Goroutine 从 ch 接收该数据并打印输出。

3. Channel 的特性

  • 类型安全:Channel 传递的数据类型是固定的,发送和接收的数据类型必须匹配。
  • 同步性Channel 默认是同步的,即发送和接收操作会阻塞,直到另一方准备好接收或发送数据。这样可以保证 Goroutine 之间的数据安全。
  • 双向和单向 Channel:Channel 默认是双向的,可以进行发送和接收操作。但是可以通过类型转换限制为单向 Channel。

示例:单向 Channel

func sendData(ch chan<- int) { // 只能发送数据的 Channel
    ch <- 100
}

func main() {
    ch := make(chan int)
    go sendData(ch)
    fmt.Println(<-ch)
}

sendData 函数中,ch 被定义为只能发送数据的 Channel chan<- int

4. 缓冲 Channel

Go 支持 缓冲 Channel,即 Channel 可以存储一定数量的元素,而不必立刻被接收。可以通过在 make 时指定容量来创建缓冲 Channel:

ch := make(chan int, 3)  // 创建一个容量为 3 的缓冲 Channel

缓冲 Channel 的发送操作在缓冲区未满时不会阻塞,接收操作在缓冲区不为空时不会阻塞。

示例:缓冲 Channel

package main

import "fmt"

func main() {
    ch := make(chan int, 2)
    ch <- 10  // 非阻塞
    ch <- 20  // 非阻塞

    fmt.Println(<-ch)  // 输出: 10
    fmt.Println(<-ch)  // 输出: 20
}

5. Channel 的关闭

可以使用 close 函数关闭一个 Channel,表示不再向 Channel 发送数据。关闭 Channel 后,可以继续从中接收数据,直到 Channel 为空。

示例:关闭 Channel

package main

import "fmt"

func main() {
    ch := make(chan int, 2)
    ch <- 10
    ch <- 20
    close(ch)  // 关闭 Channel

    for v := range ch {  // 使用 `range` 迭代接收 Channel 数据
        fmt.Println(v)
    }
}

在此代码中,range 用于迭代一个已关闭的 Channel,直到 Channel 中的数据全部读取完毕。

总结

Channel 是 Go 并发编程中的核心工具,提供了 Goroutine 之间的安全通信机制。
通过 Channel,可以避免显式的锁操作,让 Goroutine 之间的数据传输和同步更加简洁。
Channel 默认是同步阻塞的,但也可以创建缓冲 Channel 实现异步通信。

标签:ch,语言,int,make,Goroutine,chan,Go,Channel
From: https://www.cnblogs.com/niumachen/p/18517727

相关文章

  • 如何在Go中进行单元测试
    #如何在Go中进行单元测试在Go语言中进行单元测试是确保代码质量和功能正确性的重要手段。Go的标准库提供了`testing`包来支持单元测试、基准测试、示例函数等测试方式。本文将详细介绍如何在Go语言中有效地进行单元测试,包括编写测试用例、运行测试、使用表驱动测试、测试覆盖率......
  • 使用R语言可视化地图数据
    在科研工作中,经常会遇到需要在地图上展示数据的情况,今天分享一下如何使用R语言可视化地图数据#先安装和导入R包,这里使用了本地地图数据,所以只导入maps包即可#install.packages("maps")library(maps)#设置文件路径及导入数据,导入的china.rda数据会在文末链接分享setwd("D......
  • 西安短期驻场:python+flask/django 1.5万/月可谈
    驻场周期:2个月,不包食宿。地点:西安高新区费用:1.5万/月。可谈python后台开发岗位要求:-本科及以上学历,计算机相关专业,3年以上开发经验。-熟悉Python及其主流框架flask或django。-熟悉数据库设计与优化,如MySQL、Mango等,具备数据库性能调优经验。-熟练使用Git等版本控制工具,具备......
  • Python+Django框架淘宝家用电器销售数据可视化系统作品截图和开题报告参考
     博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育、辅导。所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩,提供核心代码讲解,答辩指导。项目配有对应开发......
  • 使用FastAPI整合Gradio和Django
    大家好,我是每天分享AI应用的萤火君!经常接触机器学习的同学可能都接触过Gradio这个框架,Gradio是一个基于Python的专门为机器学习项目创建的快速开发框架,可以让开发者快速发布自己的模型给用户测试,目前Huggingface上的机器学习项目都是基于Gradio对外提供服务的。不过Gradio的目......
  • golang有类似于java的spring吗_3
    为了回答这个问题:Golang是否有类似于Java的Spring框架,我们可以从两个角度来看:一、目前Golang是否有直接对应的全栈框架;二、Golang是否有能提供与Spring类似特性的框架或者库。对于第一个问题,Golang目前并没有一个完全仿照Spring的全栈框架。Java中的Spring框架是......
  • C语言学习----3
    #一些无关的小内容这个是作业的一个代码 再次可见printf %d代表对应的数据 #字符串 以上为字符串的大概含义我们用char来对字符以及字符串进行定义 printf中用%s来进行表其中的arr[]是表示数组(里面存放了很多字符)详细看下面的图片arr[]括号里一般放数据的......
  • 【全】Go 操作Redis数据库
    操作Redis数据库在Go语言中是一项常见的任务,尤其是在构建高性能应用时。以下是一个关于如何使用Go操作Redis的详细指南,涵盖了从安装、配置到不同数据类型操作的各个层次(初级、中级、高级)。1.Go操作Redis实战介绍Redis是一个开源的内存数据结构存储,支持多种数......
  • Python+Django框架山西太原二手房数据可视化大屏系统开题报告参考
     博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育、辅导。所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩,提供核心代码讲解,答辩指导。项目配有对应开发......
  • MongoDB 部署指南:从 Linux 到 Docker 的全面讲解
    一、MongoDB简介MongoDB是一种NoSQL数据库,以文档模型存储数据,具备高性能、弹性扩展性和分布式架构等特点,非常适用于高并发和大数据量的场景。本文将从Linux和Docker环境开始讲解,帮助读者在不同环境下顺利部署MongoDB。二、在Linux(CentOS)上部署MongoDB2.1......