1.通道简介
通道(channel)是用来传递数据的一个数据结构。通道可用于两个 goroutine 之间通过传递一个指定类型的值来同步运行和通讯。操作符 <-
用于指定通道的方向,发送或接收。如果未指定方向,则为双向通道。
2.两种通道
注意:如果通道不带缓冲,发送方会阻塞直到接收方从通道中接收了值。如果通道带缓冲,发送方则会阻塞直到发送的值被拷贝到缓冲区内;如果缓冲区已满,则意味着需要等待直到某个接收方获取到一个值。接收方在有值可以接收之前会一直阻塞。
goroutine 是 golang 中在语言级别实现的轻量级线程,仅仅利用 go 就能立刻起一个新线程。多线程会引入线程之间的同步问题,在 golang 中可以使用 channel 作为同步的工具。通过 channel 可以实现两个 goroutine 之间的通信。创建一个 channel, make(chan TYPE {, NUM}) TYPE 指的是 channel 中传输的数据类型,第二个参数是可选的,指的是 channel 的容量大小。向 channel 传入数据, CHAN <- DATA , CHAN 指的是目的 channel 即收集数据的一方, DATA 则是要传的数据。从 channel 读取数据, DATA := <-CHAN ,和向 channel 传入数据相反,在数据输送箭头的右侧的是 channel,形象地展现了数据从隧道流出到变量里。(摘自菜鸟笔记)
向通道发送值或者指针 使用 chan <- data
从通道读数据 data:=<-chan
ex1 通道不缓冲,发送方发送信息,接收不接收,阻塞代码:
ex2 通道缓冲, 发送方发送消息, 接收方不接收消息,代码不阻塞:
ex3: 通道不缓存,发送方发送消息,接收方接收消息,代码正常运行:
ps: 代码只是学习代码,因此没有考虑正常关闭channel之类的操作,说到这个,提一句,通过关闭后close(channel),goroutine依旧可以从通道接收数据,但是不能再向通道发送数据。这一点很重要,带缓存的通道可以再通道关闭之后依旧可以保证取出缓存中所有的数据,而不会有数据丢失。从一个已经关闭且没有数据的通道里获取数据,总会立刻返回,并返回一个通道类型的零值。如果在获取通道的时候还加入了可选的标志,就能得到通道的状态信息。
向大佬请教: 本人之前写java, 以为这边的阻塞效果会是代码一直在运行,然后阻塞在12行的输出,但是go直接报错的,
这里希望有知道的大佬指教一下。感觉是go的语言处理机制。
本人近期刚学go,写博客纯属于记笔记,若有理解有误的地方还请大牛不吝赐教,谢谢。