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

Chr*_*ian 16 go

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

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

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

nem*_*emo 22

毕竟它是一个全局变量吗?

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

但是,这不是存储net/http包的所有敏感信息的全局变量.它仅仅是一种便利设置,其使用net/http包的内容来向用户提供快速启动机会.这也意味着,这不会增加太多的复杂性.

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

IMO,优良作法是帮助用户使用包.如果您发现可以通过提供良好的默认配置来节省用户一些时间,请执行此操作.

但是,当您要导出变量时应该小心.它们应该为并发访问做好准备.的DefaultServeMux(或更好的,底层ServeMux),例如,是使用一个互斥线程安全.

Go中的全局变量总是线程/ goroutine安全吗?

没有正确的同步(互斥,通道,...),同时访问的所有内容都是有问题的,并且肯定会把所有东西都吹成碎片.

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

logging例如,Python的模块提供了一个检索根日志记录对象的函数,可以调用方法来自定义日志记录行为.这可以被视为一个全局对象,因为它是可变的并在模块中定义.