gpt4 book ai didi

go - "net/http"使用全局变量在golang中被认为是一种好的做法吗?

转载 作者:IT老高 更新时间:2023-10-28 13:04:46 27 4
gpt4 key购买 nike

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

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

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

最佳答案

Is it a global variable after all?

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

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

Is this considered a good practice or even an golang idiom?

IMO,帮助用户使用包是一种很好的做法。如果您发现可以通过提供良好的默认配置,这样做。

但是,当您要导出变量时应该小心。它们应该准备好进行并发访问。例如,DefaultServeMux(或者更好的是底层的ServeMux)是using a mutex为了线程安全。

Are global variables always thread/goroutine safe in Go?

没有。如果没有适当的同步(互斥体、 channel 等),并发访问的所有内容都会出现问题,并且肯定会将所有内容都炸成碎片。

I've never seen such practice in other languages / standard libraries.

例如,

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

关于go - "net/http"使用全局变量在golang中被认为是一种好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12230643/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com