码迷,mamicode.com
首页 > 其他好文 > 详细

Go 管道

时间:2020-04-05 18:14:04      阅读:78      评论:0      收藏:0      [点我收藏+]

标签:指定   取出   func   ntc   数据结构   insert   情况   完成   highlight   

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 管道

标签:指定   取出   func   ntc   数据结构   insert   情况   完成   highlight   

原文地址:https://www.cnblogs.com/flycc/p/12638098.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!