golang包“net / http”使用全局变量DefaultServeMux来注册处理程序。这被认为是一种很好的做法,甚至是一种golang成语吗?毕竟它是一个全局变量吗?
不使用全局变量的两个主要原因是AFAIK 1)它们增加了复杂性,2)在并发程序中存在问题。
也许1)在这种情况下不被认为是重要的,因为开发人员可以选择不使用DefaultServerMux? 2)怎么样? Go中的全局变量总是线程/ goroutine安全吗?不过,我很惊讶它用在Go的标准库中。我从未在其他语言/标准库中看到过这种做法。
答案 0 :(得分:22)
毕竟它是一个全局变量吗?
是。根级别的变量为defined,这使得它在整个包中都是全局的。
但是,这不是存储所有敏感信息的全局变量
net/http
包的内容。它只是一个使用内容的便利设置
net/http
包为用户提供快速入门机会。
这也意味着,这不会增加太多的复杂性。
这被认为是一种好习惯还是一种golang成语?
IMO,优良作法是帮助用户使用包裹。 如果您发现可以通过提供一个来节省用户一些时间 良好的默认配置,这样做。
但是,在您要导出变量时应该小心。
它们应该为并发访问做好准备。
例如DefaultServeMux
(或更好,基础ServeMux
)是using a mutex是线程安全的。
Go中的全局变量总是线程/ goroutine安全吗?
没有。如果没有适当的同步(互斥,通道,......),同时访问的所有内容都会产生问题,而且肯定会把所有东西都搞砸了。
例如,Python的我从未在其他语言/标准库中看到过这种做法。
logging
模块提供了一个检索根日志记录对象的函数,可以调用方法来自定义日志记录行为。这可以看作是一个全局对象,因为它是可变的并在模块中定义。
答案 1 :(得分:1)
在这种情况下,globvar是安全的,也可以选择像“log”包中所见的类似物一样好。
IOW,声明1尽可能模糊,声称2受到限制:某些时间/某处为真,否则为假= =即使使用就像这样,也不会保留。