【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 @ 2024-04-08 23:36  alisleepy  阅读(17)  评论(0编辑  收藏  举报