小编典典

在netlang中,“ net / http”对全局变量的使用是否被视为一种好习惯?

go

golang包“ net /
http”使用全局变量DefaultServeMux来注册处理程序。这被认为是一种很好的做法,甚至被认为是golang的成语?毕竟是全局变量吗?

不使用全局变量的两个主要原因是AFAIK 1)它们增加了复杂性,2)在并发程序中存在问题。

也许1)在这种情况下不重要,因为开发人员可以选择不使用DefaultServerMux?那2)呢?全局变量在Go中始终是线程/
goroutine安全的吗?不过,令我惊讶的是它在Go的标准库中使用了。我从未在其他语言/标准库中看到过这种做法。


阅读 213

收藏
2020-07-02

共1个答案

小编典典

毕竟是全局变量吗?

是。该变量是在根级别定义的,这使得它在整个包中都是全局的。

但是,这不是一个全局变量,它存储了net/http程序包的所有明智信息。它仅仅是一种便利设置,它使用net/http软件包的内容为用户提供了快速入门的机会。这也意味着,这不会增加太多复杂性。

这被认为是一种很好的做法,甚至被认为是golang的成语?

IMO,一个好的做法是帮助用户使用包装。如果发现可以通过提供良好的默认配置来节省用户一些时间,请这样做。

但是,当您要导出变量时,请务必小心。应该准备好进行并发访问。的DefaultServeMux(或更好的,底层ServeMux),例如,是使用互斥线程安全。

全局变量在Go中始终是线程/ goroutine安全的吗?

不可以。如果没有适当的同步(互斥,通道等),则同时访问的所有内容都会出现问题,并且很可能会将所有内容一分为二。

我从未在其他语言/标准库中看到过这种做法。

logging例如,Python的模块提供了一种检索根日志记录对象的功能,可以调用该方法来自定义日志记录行为。这可以看作是全局对象,因为它是可变的并且在模块中定义。

2020-07-02