如何从变量声明常量?
How to declare a constant from a variable?
问题是什么:
我想从一个变量声明一个常量。这是我想做的一个非常简单的版本:
someVar := 1
const someConst = someVar // error: const initializer someVar is not a constant
fmt.Printf("%d %d", someVar, someConst)
如何使 someConst
成为常量?这不可能吗?
我为什么要这个?
someVar
是一个全局变量。这很好,可以改变。 someConst
是函数范围的。对于此功能的范围,它不应更改。
用数据库术语来说:someConst
是 someVar
的不可变快照
你不能。 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)
}
问题是什么:
我想从一个变量声明一个常量。这是我想做的一个非常简单的版本:
someVar := 1
const someConst = someVar // error: const initializer someVar is not a constant
fmt.Printf("%d %d", someVar, someConst)
如何使 someConst
成为常量?这不可能吗?
我为什么要这个?
someVar
是一个全局变量。这很好,可以改变。 someConst
是函数范围的。对于此功能的范围,它不应更改。
用数据库术语来说:someConst
是 someVar
你不能。 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)
}