如何从变量声明常量?

How to declare a constant from a variable?

问题是什么:

我想从一个变量声明一个常量。这是我想做的一个非常简单的版本:

Go playground

someVar := 1
const someConst = someVar // error: const initializer someVar is not a constant
fmt.Printf("%d %d", someVar, someConst)

如何使 someConst 成为常量?这不可能吗?

我为什么要这个?

someVar 是一个全局变量。这很好,可以改变。 someConst 是函数范围的。对于此功能的范围,它不应更改。

用数据库术语来说:someConstsomeVar

的不可变快照

你不能。 Go 的 constants 必须是编译时常量。

A constant declaration binds a list of identifiers (the names of the constants) to the values of a list of constant expressions.

Constant expressions may contain only constant operands and are evaluated at compile time.

someVar 在你的例子中是一个变量,它不符合“常量操作数”的条件。

如果包级别变量可能会在您的函数执行过程中发生变化,而您不想观察到这种变化,请创建该变量的本地副本,并使用该本地副本。

另请注意,如果变量的值可能因(并发)goroutine 而更改,则必须同步访问它(在制作副本时)(就像在其他 goroutine 中写入它一样)。

例如:

var (
    someVarMu sync.RWMutex
    someVar   = 1
)

func foo() {
    someVarMu.RLock()
    myVar := someVar
    someVarMu.RUnlock()

    // Use myVar
    fmt.Println(myVar)
}