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‘(代码片段

你知道的Go切片扩容机制可能是错的

go语言管道(channel)

go语言管道(channel)

使用 FFmpeg 通过管道输出视频片段

r 计算管道的步骤(基本片段)