在一些语言中,例如Java和C ++,可以创建常量,并在构造函数期间分配它们的值(然后在此之后不再更改)。是否有办法在Golang中做到这一点,以便可以创建一个直到运行时才知道值的常量?提前感谢!
Go中的常量是在编译时设置的。请参阅文档中的相关部分:https://golang.org/doc/effective_go.html#constants
Go中的常量就是常量。即使在函数中定义为本地变量,它们也是在编译时创建的,并且只能是数字、字符(符文)、字符串或布尔值。由于受到编译时间限制,定义它们的表达式必须是常量表达式,可以由编译器计算出来。例如,1<<3是一个常量表达式,而math.Sin(math.Pi/4)不是,因为需要在运行时调用math.Sin函数。
如上所述,根据Go语言规范或Go运行时,没有支持运行时常量的构造。
但是您可以使用未导出字段和“getter”方法来模拟运行时常量,例如:
package wrapper
type Immutable struct {
value int
}
func (i Immutable) Get() int { // You may choose between pointer or value receiver
return i.value
}
func New(value int) Immutable {
return Immutable{value}
}
New()
函数创建Immutable
值,而包外的任何人都无法修改包装的int
值(Immutable.value
)。unsafe
包的任何人,但这并不算数。即使在Java中,您也可以使用Java反射更改final
属性的值。)// ./vendor/structstuff/structstuff.go
package structstuff
type constVal struct {
val int
}
func (c *constVal) Value() int {
return c.val
}
var ExportedVal constVal
func init() {
ExportedVal.val = 43
}
func CallFunc(c constVal) int {
return c.val
}
// ./main.go
package main
import (
"fmt"
"structstuff"
)
func main() {
fmt.Println(structstuff.ExportedVal.Value())
fmt.Println(structstuff.CallFunc(structstuff.ExportedVal))
}
您可以在运行时使用匿名函数来像常量一样进行操作,如下所示:
package main
import (
"fmt"
)
func main() {
// Define a Runtime constant
pi := func() float64 { return 3.141592653589793238 }
// Use the constant
x := pi() * 123
// Print the result
fmt.Println("X = ", x)
}