如何在 Go 中声明一个不可变变量?

How to declare an immutable variable in Go?

我正在解决一些练习以练习围棋,并遇到了 以下问题。

取这个函数:

func foo(s string) {
    length := len(s);

    // Do something just reading from lenght
}

在这里,多亏了其他语言的编程,我的思绪立刻“变长了” 不会被修改,所以应该标记为const。

所以我这样做了:

const length = len(s);

但它给我以下错误:

const initializer len(s) is not a constant

我想那是因为 len(s) 无法“在编译时”计算(不是 确定这是否 100% 正确地谈论 go)。

有什么方法可以表明length不应该被修改吗?我搜索过 在 Google 中,但我没有发现任何有用的东西。我对不可变结构有一些了解,但是 我认为它对于我想做的事情来说太复杂了。

您不能将变量指定为不可变的。只有常量才有这个 属性.

Go 中的常量也是编译时常量,这意味着你不能将它初始化为依赖于某些变量的特定值的东西,比如 s你的榜样。

同样,使用 rare exceptions, functions cannot return constants. Even when they can, it must still be a compile-time constant. len can return a constant value,但前提是参数的大小是恒定的,例如字符串常量或数组类型(具有固定大小)。

对于具有类似结果的内容,您可以使用私有字段。做一个模块 像这样:

package foo

type Length struct { value int }

func NewLength(s string) Length {
   return Length{
      len(s),
   }
}

func (l Length) Int() int { return l.value }

然后像这样使用:

package main
import "foo"

func main() {
   l := foo.NewLength("north")
   println(l.Int() == 5)
   // l.value undefined (cannot refer to unexported field or method value)
   l.value = 6
}