1. channel有分,单向、双向,通常情况下,只说channel,就是指双向channel。
那如何声明单向通道?
var Chan = make(chan<- int, 1)
2. 在channel的宣告中,加入 <-,代表channel的方向
var sendChan = make(chan<- int, 1) //发送通道,只能发不能收var recvChan = make(<-chan int, 1) //接收通道,只能收不能发
3. 单向通道的用途: 对其它程式码(呼叫方)的约束
程式码延伸知识点:
a. channel的关闭,尽量由sender端做。
b. 带有range的for语句。for语句会不断尝试从 intChan 取出元素值,即使intChan被close,它还是会在取出所有剩余的元素值后,在结束执行。
c. 带有range的for语句。当intChan中没有元素值,它会永远阻塞在for的那一行。
d. 带有range的for语句。如果当intChan的值为nil,那它会永远阻塞在for的那一行。
package mainimport ("fmt")func main() { intChan := SendIntChan() for v := range intChan { fmt.Printf("The value in intChan: %d\n", v) }}//返回 <-chan int 类型的 channel//呼叫方,只能从channel接收元素值func SendIntChan() <-chan int { num := 5 ch := make(chan int, num) for i := 0; i < num; i++ { ch <- i } close(ch) return ch}
https://play.golang.org/p/a9Gw_ZJgL0b
c 範例。(阻塞在for那一行)package mainimport ("fmt")func main() { intChan := SendIntChan() for v := range intChan { fmt.Printf("The value in intChan: %d\n", v) }}func SendIntChan() <-chan int { ch := make(chan int, 5) return ch}
https://play.golang.org/p/J_-OaR8UZ9X
参考来源:
郝林-Go语言核心36讲