【go】golang中的通道

通道: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:
没有操作的处理
}
posted @   alisleepy  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示