概述
通道的方向分为 发送
和 接管
。默认状况下,通道是双向的 (同时发送和接管),然而能够通过标识符指明通道为单向 (只读或只写)。
语法规定
可读写通道 (同时反对发送和接管)
变量 := make(chan 数据类型)# 例子ch := make(chan string)
只读通道 (只反对接管)
变量 := make(<-chan 数据类型)# 例子ch := make(<-chan string)
只写通道 (只反对发送)
变量 := make(chan<- 数据类型)# 例子ch := make(chan<- string)
类型转换
双向通道能够转换为单向通道,然而单向通道无奈转换为双向通道。
例子
package main// 参数是一个写入通道func ping(pings chan<- string) { //<-pings // 谬误: pings 通道只能写入 pings <- "hello world"}func pong(pings <-chan string, pongs chan<- string) { //pings <- "hello world" // 谬误: pings 通道只能读取 //<-pongs // 谬误: pongs 通道只能写入 msg := <-pings pongs <- msg}func main() { pings := make(chan string) pongs := make(chan string) done := make(chan bool) go ping(pings) go pong(pings, pongs) go func() { msg := <-pongs println(msg) done <- true }() <-done close(pings) close(pongs) close(done)}// $ go run main.go// 输入如下/** hello world*/