在 C++ 中,你可以这样写:std::string foo(){ const static std::vector<std::string> unchanging_data_foo_uses = {"one", "two", "three"}; ...}我一直认为这样做的一个重要优点是,这个成员只需要设置一次,然后在后续调用中不需要做任何事情,它只是坐在那里,以便函数可以完成它的工作。在 Go 中有一个很好的方法来做到这一点吗?也许编译器足够聪明,可以查看变量的值是否不依赖于参数,然后它可以像上面的代码一样对待它而不做任何重新评估?在我的特定情况下,我正在编写一个 Go 函数来将数字转换为单词(例如 42 -> “四十二”)。以下代码有效,但我对在每次调用时设置字符串数组所做的工作感到很脏,特别是因为它是递归的: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"}
3 回答
万千封印
TA贡献1891条经验 获得超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 { ... }
playground
慕虎7371278
TA贡献1802条经验 获得超4个赞
您可以在函数创建时保留的闭包中定义这些变量。(您定义并立即调用创建这些数组的匿名函数,然后创建并返回您的函数。然后将匿名函数的返回值(您的函数)分配给一个全局变量。
这个解决方案完全是一个黑客 - 既因为它非常不可读(那个数组中有什么?),并且因为你正在滥用闭包以避免混乱你的全局命名空间。更好的主意可能是使您的函数成为类方法。
但是我的解决方案实现了您的目标:数组只定义一次,并且不会弄乱任何命名空间。
- 3 回答
- 0 关注
- 205 浏览
添加回答
举报
0/150
提交
取消