消息机制认为每个并发单元是自包含的、独立的个体,并且都有自己的变量,但在不同并发单元间这些变量不共享。
channel是Go语言在语言级别提供的goroutine间的通信方式,我们可以使用channel在多个goroutine之间传递消息。channel是进程内的通信方式,因此通过channel传递对象的过程和调用函数时的参数传递行为比较一致,比如也可以传递指针等。
channel是类型相关的,一个channel只能传递一种类型的值,这个类型需要在声明channel时指定。
channel的声明形式为:
var chanName chan ElecmentType
使用内置函数make()定义一个channel:
ch := make(chan int)
在channel的用法中,最常见的包括写入和读出:
写入:ch <- value // 将一个数据value写入到channel,这会导致阻塞,直到有其他goroutine从这个channel中读取数据
读出:value <- ch // 从channel中读取数据,如果channel之前没有写入数据,也会导致阻塞,直到channel中被写入数据为止
可以关闭不再使用的channel:close(ch)
创建一个带缓冲的channel:
c := make(chan int, channel个数)
说明:在这个int类型的channel中,即使没有读取方,写入方也可以一直往channel里写入,在这个缓冲区被填充完之前都不会阻塞。