为了账号安全,请及时绑定邮箱和手机立即绑定

什么是 C++ 静态常量函数变量的 Go 等价物?

什么是 C++ 静态常量函数变量的 Go 等价物?

Go
慕容708150 2021-08-10 16:59:15
在 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


查看完整回答
反对 回复 2021-08-10
?
慕虎7371278

TA贡献1802条经验 获得超4个赞

您可以在函数创建时保留的闭包中定义这些变量。(您定义并立即调用创建这些数组的匿名函数,然后创建并返回您的函数。然后将匿名函数的返回值(您的函数)分配给一个全局变量。

这个解决方案完全是一个黑客 - 既因为它非常不可读(那个数组中有什么?),并且因为你正在滥用闭包以避免混乱你的全局命名空间。更好的主意可能是使您的函数成为类方法。

但是我的解决方案实现了您的目标:数组只定义一次,并且不会弄乱任何命名空间。


查看完整回答
反对 回复 2021-08-10
  • 3 回答
  • 0 关注
  • 205 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信