go不要导出channel

(金庆的专栏 2020.3)

不要导出并发原语

Go 提供了非常易于使用的并发原语,这也导致了它被过度的使用。我们主要担心的是 channel 和 sync package 。有的时候我们会导出一个 channel 给用户使用。另外一个常见的错误就是在使用 sync.Mutex 作为结构体字段的时候没有把它设置成私有。这并不总是很糟糕,不过在写测试的时候却需要考虑的更加全面。

当我们导出 channel 的时候我们就为这个包的用户带来了测试上的一些不必要的麻烦。你每导出一个 channel 就是在提高用户在测试时候的难度。为了写出正确的测试,用户必须考虑这些:

什么时候数据发送完成。
在接受数据的时候是否会发生错误。
如果需要在包中清理使用过的channel的时候该怎么做。
如何将 API 封装成一个接口,使我们不用直接去调用它。