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

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

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

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


眼眸繁星
浏览 215回答 2
2回答

慕尼黑的夜晚无繁华

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

德玛西亚99

在这种情况下,与例如在“ log”包中看到的类似物一样,globvar既安全又不错的选择。IOW,要求1尽可能模糊,要求2受到约束:在某个时间/某处为true,否则即使这样使用false,==通常也不成立。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go