“net / http”使用全局变量被认为是golang的一个好习惯吗?

时间:2012-09-01 19:17:49

标签: go

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

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

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

2 个答案:

答案 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受到限制:某些时间/某处为真,否则为假= =即使使用就像这样,也不会保留。