为什么不能defer close(channel)?

来源:11-5 传统同步机制

慕移动8402275

2021-05-06

文件可以defer close
lock也可以defer close
为什么channel不行?

写回答

1回答

ccmouse

2021-05-07

也是可以的,但的确比较少这样,其实是看我们这个channel的生命周期。

首先channel不一定需要close,close只是一个特殊的信号,发送方可以通过close告诉接收方,说我保证没有新的数据要发送了。如果不是这样的应用场景,就不需要close。

然后channel的生命周期一般比较长,我很可能在函数里面创建了channel,并且传递给别人使用。用了defer就会导致刚创建完就被close,比如下面:

func createDataSource() chan int {

    ch := make(chan int)

    // defer close(ch) // 这里如果close了,别人就没法用这个channel了

    return ch

}

1
0

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程