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

在 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"

}


慕容708150
浏览 206回答 3
3回答

万千封印

您可以使用全局变量,它在 go 中是完全可以接受的,特别是对于特定情况。虽然您不能对数组使用关键字 const,但您可以使用以下内容://notice that since they start with lower case letters, they won't be// available outside this packagevar (&nbsp;&nbsp; &nbsp; units = [...]string{...}&nbsp; &nbsp; tens = [...]string{ ... })func numAsWords(n int) string { ... }playground

慕虎7371278

您可以在函数创建时保留的闭包中定义这些变量。(您定义并立即调用创建这些数组的匿名函数,然后创建并返回您的函数。然后将匿名函数的返回值(您的函数)分配给一个全局变量。这个解决方案完全是一个黑客 - 既因为它非常不可读(那个数组中有什么?),并且因为你正在滥用闭包以避免混乱你的全局命名空间。更好的主意可能是使您的函数成为类方法。但是我的解决方案实现了您的目标:数组只定义一次,并且不会弄乱任何命名空间。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go