通道(channel),就像一个可以用于发送类型化数据的管道,由其负责协程之间的通信,从而避开所有由共享内存导致的陷阱;这种通过通道进行通信的方式保证了同步性。数据在通道中进行传递:在任何给定时间,一个数据被设计为只有一个协程可以对其访问,所以不会发生数据竞争。
创建通道 ch1 := make(chan string)
构建一个 int 通道的通道: chanOfChans := make(chan chan int)
带缓冲带的通道 ch1 := make(chan string, 0)
0 指可接收 0 个 string
, 即(阻塞),如果时大于 0 的数值,则为(非阻塞),取决于指的大小。
数据发送 ch1 <- '123'
将字符串 '123' 发送到 ch1
通道。
数据接收 str2 := <- ch1
使用 str2
变量接收通道的数据。
关闭通道 close(ch1)
package main import ( "fmt" "time" ) func main() { ch := make(chan string) defer close(ch) go sendData(ch) go getData(ch) // 等待了 1 秒让两个协程完成,如果不这样,sendData() 就没有机会输出。 time.Sleep(1e9) } func sendData(ch chan string) { ch <- "London" ch <- "Beijing" } func getData(ch chan string) { var input string // time.Sleep(2e9) for { input = <- ch fmt.Printf("input is (%v)\n", input) } }
注意事项:
---- Error run channel.exe with code Crashed ---- Program exited with code -2147483645: panic: all goroutines are asleep-deadlock!
ch
中的数据无人接收,就无法再给通道传入其他数据:新的输入无法在通道非空的情况下传入。所以发送操作会等待 ch
再次变为可用状态:就是通道值被接收时(可以传入变量)。