如何从变量声明常量?

Use*_*645 1 variables constants go

问题是什么:

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

去游乐场

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

我怎样才能使someConst一个常数?这在Go中是不可能的吗?

我为什么要这个?

someVar是一个全局变量。这可以改变,这很好。someConst是函数作用域。对于这个函数的范围来说,它不应该改变。

在数据库术语中:someConst是一个不可变的快照someVar

icz*_*cza 6

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

常量声明将标识符列表(常量名称)绑定到常量表达式列表的值。

常量表达式只能包含常量操作数,并在编译时求值。

someVar在您的示例中是一个变量,它不符合“常量操作数”。

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

另请注意,如果变量的值可能由于(并发)goroutine 而发生变化,则必须同步对它的访问(在进行复制时)(就像在其他 goroutine 中对其进行写入一样)。

例如:

var (
    someVarMu sync.RWMutex
    someVar   = 1
)

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

    // Use myVar
    fmt.Println(myVar)
}
Run Code Online (Sandbox Code Playgroud)