在C ++中,您可以编写如下内容:
std::string foo()
{
const static std::vector<std::string> unchanging_data_foo_uses = {"one", "two", "three"};
...
}
我一直认为这个的一个重要优点是这个成员只需要设置一次,然后在后续调用中不需要做任何事情并且它只是坐在那里以便函数可以做这是工作。在Go中有一个很好的方法吗?也许编译器足够聪明,看看变量的值是否不依赖于参数,那么它可以像上面的代码那样对待它而不进行任何重新评估?
在我的特定情况下,我正在编写一个Go函数来将数字转换为单词(例如42 - &gt;&#34;四十二&#34;)。下面的代码可以工作,但是我觉得在每次调用时都要设置字符串数组的工作很脏,特别是因为它是递归的:
func numAsWords(n int) string {
units := [20]string{
"zero",
"one",
"two",
"three",
"four",
"five",
"six",
"seven",
"eight",
"nine",
"ten",
"eleven",
"twelve",
"thirteen",
"fourteen",
"fifteen",
"sixteen",
"seventeen",
"eighteen",
"nineteen",
}
tens := [10]string{
// Dummies here just to make the indexes match better
"",
"",
// Actual values
"twenty",
"thirty",
"forty",
"fifty",
"sixty",
"seventy",
"eighty",
"ninety",
}
if n < 20 {
return units[n]
}
if n < 100 {
if n % 10 == 0 {
return tens[n / 10]
}
return tens[n / 10] + "-" + units[n % 10]
}
if n < 1000 {
if n % 100 == 0 {
return units[n / 100] + " hundred"
}
return units[n / 100] + " hundred and " + numAsWords(n % 100)
}
return "one thousand"
}
答案 0 :(得分:3)
你可以使用全局变量,它在go中是完全可以接受的,特别是对于那个特定情况。
虽然您不能将关键字const与数组一起使用,但您可以使用以下内容:
//notice that since they start with lower case letters, they won't be
// available outside this package
var (
units = [...]string{...}
tens = [...]string{ ... }
)
func numAsWords(n int) string { ... }
答案 1 :(得分:0)
Go中不存在静态变量的概念 但是,您仍然可以通过将它们标记为常量来实现您想要的效果。
Go中的常量只是常量。它们是在编译时创建的 时间,即使在功能中定义为本地人时 https://golang.org/doc/effective_go.html#constants
答案 2 :(得分:0)
您可以在创建函数时保留的闭包中定义这些变量。 (您定义并立即调用创建这些数组的匿名函数,然后创建并返回您的函数。然后将匿名函数的返回值(您的函数)分配给全局变量。
这个解决方案完全是一个黑客攻击 - 因为它非常难以理解(该数组中的内容是什么?),并且因为你滥用闭包来避免混乱你的全局命名空间。一个更好的想法可能会使您的函数成为一个类方法。
但我的解决方案实现了您的目标:数组只定义一次,并且不会混淆任何名称空间。