Go 管道
Posted 醉深梦始
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go 管道相关的知识,希望对你有一定的参考价值。
Channel是一个数据结构--队列
数据是先进先出
channel是线程安全的,多线程访问时不需要枷锁
channel是有类型的,声明时需要绑定数据类型
var chan int//双向管道 var chan<- int //只写管道 var <-chan int//只读管道 //上诉管道中的数据类型全部是int
package main import( "fmt" "time" ) func Insert(Chan chan int){ for i := 0;i< 5;i++{ fmt.Println("Insert value to chan=",i) Chan<- i time.Sleep(time.Second) } close(Chan) fmt.Println("Close chan..") } func main(){ var intChan chan int //管道使用事前需要make //intChan = make(chan int,3)//有缓冲管道 intChan = make(chan int)//无缓冲管道 go Insert(intChan) time.Sleep(time.Second * 3) for{ res,ok := <-intChan if !ok{ break } fmt.Println("get value form chan=",res) time.Sleep(time.Second) } }
管道分为有缓冲管道和无缓冲管道,阻塞和非阻塞
有缓冲管道:在make时传入空间大小,这种管道在写时非阻塞,只有当空间写满了才会阻塞,管道变得不可写,但是当有读时,管道中有空位,就变得又可写了
无缓冲管道:在make是不传输空间大小,这时是写阻塞的,只有当有读操作时才可写
所以:
channel只能存放指定的数据类型
channel的数据放满后,就不能再放入了
如果从channel取出数据后,才可再放入数据
在没有使用协程的情况下,如果channel数据取完了,再取,就会deadlock
channel使用完成后及时close,使用前需要make
channel可以使用for range 进行遍历;
在遍历时,如果channel已经关闭,则会在遍历完成后退出channel,如果没有,会出现deadlock
以上是关于Go 管道的主要内容,如果未能解决你的问题,请参考以下文章
解决go: go.mod file not found in current directory or any parent directory; see ‘go help modules‘(代码片段