5

【笔记】Go语言的管道

 1 year ago
source link: https://loli.fj.cn/2023/05/27/Go%E8%AF%AD%E8%A8%80%E7%9A%84%E7%AE%A1%E9%81%93/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

【笔记】Go语言的管道

Go语言的管道(通信)channel学习笔记

管道的特点

  • 管道的本质是一种队列数据类型,数据是先进先出的
  • 管道是线程安全的,多协程goroutine访问时无需加锁
  • 管道定义时需要指定所存储数据的数据类型

声明一个管道

可读写管道

var 管道名 chan 数据类型
var 管道名 chan<- 数据类型
var 管道名 <-chan 数据类型

定义一个管道

  • 管道是引用类型数据,必须初始化才能写入数据
  • 管道变量实质上是一个指针,这个指针指向的是一个管道的真实地址
  • 管道的容量不能自动增长
var 管道名 chan 数据类型 = make(chan 数据类型, 管道容量)

从管道读取数据

变量名 = <-管道名

ok:读取成功返回true,读取失败返回false,读取失败说明管道已关闭

变量名, ok = <-管道名

获取管道长度

len(管道名)

获取管道容量

cap(管道名)

管道的关闭

  • 关闭管道后,不能再向管道中写入数据了,但是可以继续从管道中读取数据
close(管道名)
  • 遍历管道之前一定要先关闭,如果管道没有关闭就会一直遍历,直至报deadlock错误
  • 如果在遍历时管道已经关闭,则遍历完成后会正常退出遍历
for value := range 管道名 {
...
}
  • 如果管道不清楚什么时候关,可以使用select关键字防止阻塞
label:
for {
select {
case value := <-管道名:
break
default:
break label
}
}

哔哩哔哩——尚硅谷


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK