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的模块提供了一种检索根日志记录对象的功能,可以调用该方法来自定义日志记录行为。这可以看作是全局对象,因为它是可变的并且在模块中定义。
德玛西亚99
TA贡献1770条经验 获得超3个赞
在这种情况下,与例如在“ log”包中看到的类似物一样,globvar既安全又不错的选择。
IOW,要求1尽可能模糊,要求2受到约束:在某个时间/某处为true,否则即使这样使用false,==通常也不成立。
- 2 回答
- 0 关注
- 214 浏览
添加回答
举报
0/150
提交
取消