golang包“ net /
http”使用全局变量DefaultServeMux来注册处理程序。这被认为是一种很好的做法,甚至被认为是golang的成语?毕竟是全局变量吗?
不使用全局变量的两个主要原因是AFAIK 1)它们增加了复杂性,2)在并发程序中存在问题。
也许1)在这种情况下不重要,因为开发人员可以选择不使用DefaultServerMux?那2)呢?全局变量在Go中始终是线程/
goroutine安全的吗?不过,令我惊讶的是它在Go的标准库中使用了。我从未在其他语言/标准库中看到过这种做法。
毕竟是全局变量吗?
是。该变量是在根级别定义的,这使得它在整个包中都是全局的。
但是,这不是一个全局变量,它存储了net/http
程序包的所有明智信息。它仅仅是一种便利设置,它使用net/http
软件包的内容为用户提供了快速入门的机会。这也意味着,这不会增加太多复杂性。
这被认为是一种很好的做法,甚至被认为是golang的成语?
IMO,一个好的做法是帮助用户使用包装。如果发现可以通过提供良好的默认配置来节省用户一些时间,请这样做。
但是,当您要导出变量时,请务必小心。应该准备好进行并发访问。的DefaultServeMux
(或更好的,底层ServeMux
),例如,是使用互斥线程安全。
全局变量在Go中始终是线程/ goroutine安全的吗?
不可以。如果没有适当的同步(互斥,通道等),则同时访问的所有内容都会出现问题,并且很可能会将所有内容一分为二。
我从未在其他语言/标准库中看到过这种做法。
logging
例如,Python的模块提供了一种检索根日志记录对象的功能,可以调用该方法来自定义日志记录行为。这可以看作是全局对象,因为它是可变的并且在模块中定义。
问题内容: function foo () { global $var; // rest of code } 在我的小型PHP项目中,我通常采用过程方式。通常,我有一个包含系统配置的变量,当我需要在函数中访问此变量时,我会这样做。 这是不好的做法吗? 问题答案: 当人们谈论其他语言的全局变量时,这意味着与PHP中的操作有所不同。那是因为变量在PHP 中并不是 真正的 全局变量。典型的PHP程序的范
问题内容: 为什么全局变量是不好的?[closed] 问题答案: 这与Python无关。全局变量在任何编程语言中都是不好的。 但是,全局常量在概念上与全局变量并不相同。全局常数完全无害。只是在Python中没有强制性差异,只有约定是。 它们不好的原因是它们使函数具有隐藏的(非显而易见的,令人惊讶的,难以检测的)副作用,从而导致复杂性的增加,并有可能导致产生Spaghetti代码。 但是,即使在函数
我知道有一些关于这个问题的问题和帖子/文章,但从我的新手角度来看,不完全是这样。问题是,我有一个主程序监听一个端口,并将调用重定向到一个特定的处理程序。典型结构: 处理程序类似于: 然后,包含函数foo的一些全局变量,基本上是因为函数共享需要它们(例如,当使用容器/堆实现的优先级队列时,它将从全局距离矩阵中获得Swap函数中的优先级当然是可变的)。以及许多其他例子。总之,全局变量... 问题是,正
问题内容: 我正在尝试创建一个分页类,并使用该类外部的变量。 但这给了我致命错误“在非对象上调用成员函数query()”。 这是索引文件: 这是pagi.php文件: 是否可以在类内部使用该变量,而无需在类内部创建新变量? 问题答案: 解决此问题的正确方法是将数据库对象注入另一个类(依赖项注入): 解决该问题的另一种方法是将数据库类的实例注入使用它的方法中: 您选择哪种方法取决于情况。如果只有一个
问题内容: 我知道关键字存在于Java中。但是我不记得看到使用它的代码。可能我正在使用异常,并在本可以使用的地方登录。在Java中使用关键字是否是一种好习惯? 编辑 :我知道断言通常是一个好习惯。我的问题是,更准确地说,如果在Java中断言的BKM是使用关键字而不是使用异常,日志记录和其他技术。 问题答案: 不使用断言的主要原因是因为默认情况下未启用断言。因此,如果您的条件足够重要而需要断言,则不
当我在Inno Setup脚本的< code>[Code]部分(Pascal脚本)声明一个全局变量时,它是否自动初始化为零/空值?还是必须显式初始化它(例如在< code>InitializeSetup事件函数中)? 根据我的经验,变量是零初始化的。不过,我不确定我是否只是运气不好。 我已经完成了10.000次测试代码迭代。全局变量(或各种类型、整数、字符串、指针)始终为零初始化。