[Golang]单向channel介绍

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 main

import (
	"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

  1. c 范例。(阻塞在for那一行)
package main

import (
	"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讲


<<:  IP资料单元(Datagram)或封包(Packet)?

>>:  [JS] You Don't Know JavaScript [this & Object Prototypes] - Object [番外 - getter/setter]

2022重拾程序-写文件

服用注意:本篇绝对不是在教你如何21天养成一个计划、或戒掉什麽拖延症、还是什麽断舍离的文章! 上述这...

建立第一份html文件

建立第一份html文件,需要注意一些细节 如没宣告加上!doctype html会导致浏览器解读功...

Day-28 Virtual Memory

Virtual Memory tags: IT铁人 跟上一篇有点关系的内容,我们会利用Disk来代替...

【Day 10】Concurrency control in apps

todos: 还在出去玩,之後补上演算法 pesudocode + comments 8.2 提到的...

k8s elk 架设elastalert - 对slack发出及时的警报系统

【YC的寻路青春】 架设好elk之後,除了kibana可以看以外 想要做及时的警报系统 我们这边选择...