在go语言中需要使用内置函数make来创建一个通道
make的第一个参数是关键字chan,之后跟着允许通道交换的数据类型。如果创建的是一个有缓存的通道,之后还要再第二个参数指定缓存区的大小。
//无缓存的整形通道
unbuffered:=make(chan int)
//有缓存的字符串通道
buffered:=make(chan string,10)
向通道发送值或指针需要用到 <- 操作符
//创建一个有缓存的字符串通道
buffered:=make(chan string,10)
//通过通道发送一个字符串
buffered<-"Gopher"
//从通道接受一个字符串
value:=<-buffered
注:
无缓冲的通道是指在接收前没有能力保存任何值得通道,这种通道要求发送goroutine和接收goroutine同时准备好,才能完成发送和接收的操作,如果两个goroutine没有同时准备好,通道会导致先执行发送或接收的goroutine阻塞等待,这种对通道进行发送和接受的行为本身就是同步的,其中任意一个操作都无法离开另一个操作而单独存在。
有缓冲通道是一个在被接受前能存储一个或多个值的通道。这种类型的通道并不强制要求goroutine之间必须同时完成发送和接收,通道会阻塞发送和接收的动作也会不同,只有在通道没有要接收的值时,接收动作才会阻塞,只有通道没有可用缓存区容纳被发送的值时,发送动作才会被阻塞,这导致有缓存的通道和无缓存的通道之间的一个很大的不同:无缓冲的通道保证进行发送和接收的goroutine会在同一时间进行数据的交换,有缓冲的通道没有这种保证。
关闭通道:当通道关闭后,goroutine依旧可以从通道接收数据,但不能再向通道里发送数据。
从一个已经关闭且没有数据的通道里获取数据,总会立刻返回,并返回一个通道类型的零值。