1.通道是什么

通道,在golang中的形式为类型为chan,是golang中同步的两个机制之一(另一个是WaitGroup)。

chan的语法形式如下:

ChannelType = ( "chan" | "chan" "<-" | "<-" "chan" ) ElementType .
chan的类型可以是chan、chan<-、<-chan任意一种+数据类型(如int或者自定义类型)

2.通道的用法

1)创建chan

创建chan的方法如下:

c := make(chan int, 1)

make后面为缓冲数目,如果不加缓冲,则为无缓冲。

可以创建只有读或者写的chan,但这样的通道没有什么用,故在实践中不常存在。

2)读写chan

读写chan的符号为<-。读chan形式为 <-ch, 写chan形式为 ch<-。

缓冲数意味着读取或写入数目够了的话,将无法进行读取或写入。

没有缓冲的chan将会阻塞读或者写,直到有读或者写。

3)关闭chan

关闭chan的方法为close()。chan被关闭以后,并不马上消除空间(因为golang语言的)

4)无缓冲的chan与有缓冲的chan

就像上面的所说的,如果不加缓冲数目,则为无缓冲的chan;否则会生成一定缓冲数目。

没有缓冲的chan将会阻塞读或者写,直到有读或者写。

缓冲数目够了以后,chan也将不会读和写。

5)chan与select

chan可以与select一起用,用于并发控制。

select和chan的用法如下:

1)select会遍历所有case;

2)所有的case都会被求值或计算,求值或计算顺序:从左到右,从上到下;

3)如果chan没有阻塞,则随机执行一个case;

4)如果chan被阻塞,则直到一个chan不被阻塞才会执行。