为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
眼眸繁星 2021-05-12 10:54:18
golang包“ net / http”使用全局变量DefaultServeMux来注册处理程序。这被认为是一种很好的做法,甚至被认为是golang的成语?毕竟是全局变量吗?不使用全局变量的两个主要原因是AFAIK 1)它们增加了复杂性,并且2)在并发程序中存在问题。也许1)在这种情况下不重要,因为开发人员可以选择不使用DefaultServerMux?那2)呢?全局变量在Go中始终是线程/ goroutine安全的吗?不过,令我感到惊讶的是它在Go的标准库中使用了。我从未在其他语言/标准库中看到过这种做法。
查看完整描述

2 回答

?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

毕竟是全局变量吗?

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

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

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

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

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

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

不可以。如果没有适当的同步(互斥,通道等),则同时访问的所有内容都会出现问题,并且很可能会把所有内容零碎地粉碎。

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

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


查看完整回答
反对 回复 2021-05-17
?
德玛西亚99

TA贡献1770条经验 获得超3个赞

在这种情况下,与例如在“ log”包中看到的类似物一样,globvar既安全又不错的选择。

IOW,要求1尽可能模糊,要求2受到约束:在某个时间/某处为true,否则即使这样使用false,==通常也不成立。


查看完整回答
反对 回复 2021-05-17
  • 2 回答
  • 0 关注
  • 214 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信