首页 > 其他分享 >【go】golang中的通道

【go】golang中的通道

时间:2024-04-08 23:44:25浏览次数:28  
标签:接收 intCh chan golang var go 接收数据 通道

通道:channel

名词:在 goroutine 中通信的管道

注意:任何时候,同一时刻只能有一个 goroutine 访问通道进行发送和获取数据

通道的顺序:遵循先入先出的规则

通道的定义

// 定义一个通道
var 变量名 chan 数据类型

// 比如:
var intCh chan int64
var strCh chan string
var mapCh chan map[string]any

注意:通道必须使用 make 函数进行初始化,只定义不能使用,报错空指针

// 初始化通道
intch := make(chan int64)
strch := make(chan string)
prtch := make(chan *int64)

通过通道发送数据

// 发送数据
通道名 <- 数据
// 比如:
intCh <- 10  // 把10发送到通道intCh中
strCh <- "alisleepy"  // 把字符串alisleepy发送到通道strCh中

通过通道接收数据

// 接收数据
var intCh chan int
intCh <- 10  // 给发送数据到intCh中

// 定义另一个通道,接收数据
recIntCh := make(chan int)
recData := <- recIntCh   // 表示把recIntCh通道的数据取出来赋值给data

通道的 4 种接收方式

  1. 阻塞接收数据

    // 执行该语句时发生阻塞,一直直到接收到数据并赋值给data
    data := <-intCh
    
  2. 非阻塞接收数据

     data, ok := <-intCh
     // data : 表示接收到的数据
     // ok:表示是否成功接收到数据,如果ok为否,则表示未接收到数据,data的值为通道的零值
    

    注意:非阻塞式的接收方式实际使用很少,会造成高 CPU 使用

  3. 只接受收据,忽略接收的值

    // 该语句会发生阻塞,直到接收到数据
     <- intCh  // 只接收数据,不把接收的值赋给其他变量
    
  4. 循环接收通道内的数据

     // 使用for range循环接收
     for data := range intCh {
         // todo:接收数据后的一些处理事项
     }
    

单向通道

  1. 单向通道声明方式
// 只能发送数据的通道
var 变量名 chan<- 数据类型
比如:var intCh chan<- int  // intCh只能发送数据,箭头是数据流向,指向chan,表示数据只能发送到chan
// 只能接收收据的通道
var 变量名 <-chan 数据类型
比如:var strCh <-chan string

带缓冲的通道

1.创建带缓冲的通道

// 增加一个参数,缓冲区大小
var intCh := make(chan int, 10)  // 缓冲区大小为10

通道的多路复用-同时接收和发送多个通道的数据

  1. 描述:就是一条通道上,可以同时接收和发送,比如:电话线
  2. 关键字:
  • select:可以在程序中同时处理多个通道的操作,包括:发送数据、接收数据
  • case:case 中的操作必然是一个通道的收发过程
select{
    case 操作1:
        响应操作1
    case 操作2:
        响应操作2
    default:
        没有操作的处理
}

标签:接收,intCh,chan,golang,var,go,接收数据,通道
From: https://www.cnblogs.com/alisleepy/p/18122925

相关文章

  • 基于融合语义信息改进的内容推荐算法。Improved content recommendation algorithm in
    引言路漫漫其修远兮,吾将上下而求索。每天一篇论文,做更好的自己。本文读的这篇论文为发表于2023年5月28日的一篇名为《基于融合语义信息改进的内容推荐算法》(基于融合语义信息改进的内容推荐算法)的文章,文章主要介绍了基于内容的推荐技术在电子商务和教育领域的广泛应用,以及传统基......
  • Django框架之form组件
    一、前戏需求:写一个注册功能获取用户名和密码,利用form表单提交数据在后端判断用户名和密码是否符合一定的条件用户名不能含有三国演义密码不少于三位1、前端<formaction=""method="post"><p>username:<inputtype="text"name="username"><......
  • Django框架之Cookie和Session
    一、cookie与session的发展史Cookie和Session是Web开发中常用的两种机制,用于在客户端和服务器之间存储和管理用户信息。1、Cookie的发展史:1994年:由Netscape公司的工程师LouMontulli发明。最初的目的是为了解决HTTP协议的状态管理问题,使网站能够在浏览器端存储和读取用户信息......
  • Django框架之分页器使用
    一、问题描述针对上一篇章的批量插入数据,我们会发现一个很严重的问题,将所有数据都放到前端页面展示的时候一千多条数据放在了一页,这样太不方便,就像书本一样,不可能把所有内容都放在一页吧。所以我们可以也想书本一样,尝试做分页处理二、分页推导首先需要明确的是,get请求/post请......
  • RuntimeError: requested profile "F:\code\chromium_git\chromium\src\chrome\
    RuntimeError:requestedprofile"F:\code\chromium_git\chromium\src\chrome\build\pgo_profiles\chrome-win64-5481-1675874756-509946de85f2a6f58f14f39a5e26a0ae82afaec0.profdata"doesn'texist,pleasemakesure"checkout_pgo_profiles......
  • ArangoDB:探索多模型数据库的魅力
            ArangoDB是一款多模型数据库,它支持图形、文档和键值数据存储,这使得它在处理各种类型的数据和应用场景时具有极大的灵活性。以下是对ArangoDB的介绍,包括其特点优势、安装步骤以及基本使用命令和代码。        ArangoDB的特点与优势        1......
  • go modules
    目录在一个空文件夹下,初始化一个Module$gomodinitexamplego:creatingnewgo.mod:moduleexample此时,在当前文件夹下生成了go.mod,这个文件记录当前模块的模块名以及所有依赖包的版本。接着,我们在当前目录下新建文件main.go,添加如下代码:packagemainimport( "......
  • 视频监控汇聚平台智能边缘分析一体机视频智能分析平台室内消防逃生通道占用检测算法
    随着城市化进程的不断推进,人口密集的建筑物中,室内消防逃生通道的畅通显得尤为重要。然而,在紧急情况下,如火灾或其他灾害事件,通道被占用可能导致人员无法及时安全撤离,增加事故风险。为此,智能边缘分析一体机室内消防逃生通道占用检测算法应运而生,以确保逃生通道的畅通和人员的安全......
  • go reflect
    goreflect反射核心反射的核心是两个对象,分别是reflect.Type和reflect.Value。它们分别代表了go语言中的类型和值。我们可以通过reflect.TypeOf和reflect.ValueOf来获取到一个变量的类型和值。funcmain(){ vara=1 fmt.Println(reflect.ValueOf(a)) fmt.Print......
  • python计算机毕设【附源码】基于Android开发的智能音乐播放系统(django+mysql+论文)
    本系统(程序+源码)带文档lw万字以上  文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:随着移动互联网的飞速发展,智能手机已经成为人们日常生活中不可或缺的一部分。在众多手机应用中,音乐播放系统是用户使用频率较高的应用之一。传统的音乐播放......