golang包“ net / http”使用全局变量DefaultServeMux来注册处理程序。这被认为是一种很好的做法,甚至被认为是golang的成语?毕竟是全局变量吗?
不使用全局变量的两个主要原因是AFAIK 1)它们增加了复杂性,2)在并发程序中存在问题。
也许1)在这种情况下不重要,因为开发人员可以选择不使用DefaultServerMux?那2)呢?全局变量在Go中始终是线程/ goroutine安全的吗?不过,令我惊讶的是它在Go的标准库中使用了。我从未在其他语言/标准库中看到过这种做法。
毕竟是全局变量吗?
是。该变量是在根级别定义的,这使得它在整个包中都是全局的。
但是,这不是一个全局变量,它存储了net/http程序包的所有明智信息。它仅仅是一种便利设置,它使用net/http软件包的内容为用户提供了快速入门的机会。这也意味着,这不会增加太多复杂性。
net/http
这被认为是一种很好的做法,甚至被认为是golang的成语?
IMO,一个好的做法是帮助用户使用包装。如果发现可以通过提供良好的默认配置来节省用户一些时间,请这样做。
但是,当您要导出变量时,请务必小心。应该准备好进行并发访问。的DefaultServeMux(或更好的,底层ServeMux),例如,是使用互斥线程安全。
DefaultServeMux
ServeMux
全局变量在Go中始终是线程/ goroutine安全的吗?
不可以。如果没有适当的同步(互斥,通道等),则同时访问的所有内容都会出现问题,并且很可能会将所有内容一分为二。
我从未在其他语言/标准库中看到过这种做法。
logging例如,Python的模块提供了一种检索根日志记录对象的功能,可以调用该方法来自定义日志记录行为。这可以看作是全局对象,因为它是可变的并且在模块中定义。
logging