猿问

在初始化过程中建立的Go常量

在我的Go程序中,有一些配置值,我希望在程序执行期间保持不变,但是希望能够在部署站点上进行更改。据我所知,没有办法用const关键字来实现这一点,因为(再次,据我所知)其值必须是在编译时指定的常数。这意味着实现我想要的唯一方法是声明普通变量并在包的init功能期间对其进行初始化。并不是说那行不通,而是现在没有任何东西可以防止这些伪常量的值发生变化。

我的两个问题是:

  1. 我是否缺少有关const工作原理的信息?

  2. 假设我不是,处理此问题的首选方法是什么?一个公共函数返回一个我从未公开,从未更改过的私有变量?只是希望人们不要更改变量,因为它们实际上是配置设置?


慕姐4208626
浏览 247回答 3
3回答

小怪兽爱吃肉

创建一个文件“ config.go”并创建要公开的变量。不要导出它们(将它们全部变成小写)。而是创建func允许访问每个项目的public(大写)。package configvar x = 10func X() int {   return x}当您需要这些变量时,可以简单地import ./config在代码中使用它们,如下所示:if config.X()显然,您可以在package中设置变量init。

达令说

这是一个非常好的问题,因为它深入研究了我怀疑可能是Go(不可变)状态所遗漏的内容。来自语言参考,“常量表达式可能只包含常量操作数,并在编译时计算。”您不能使vars恒定,这是一个遗憾。Joe的答案提出封装是一种解决方案,它将很好地工作-但它冗长,乏味并且可能会引入错误。相比之下,许多不纯函数语言将可变变量与单分配不可变值结合在一起。例如,Scala具有关键字“ val”和“ var”;Scala的“ var”的含义与Go的“ var”非常相似。不变性是工具箱中的有用工具,因为可以编写有状态透明的过程代码以及参照透明的无副作用函数。两者都有自己的位置。不可变性也是并发的一种有价值的工具,因为如果在goroutine之间共享不可变值,则不必担心可能的竞争条件。因此,在我看来,这是Go的缺点之一,这是Go的缺点之一。支持val和var可能并不难,区别在于编译器检查每个val是否被精确分配了一次。在添加该功能之前,必须将封装作为唯一选择。
随时随地看视频慕课网APP

相关分类

Go
我要回答