在某些语言中,例如Java和C ++,可以创建常量,然后在构造函数中分配它们的值(之后不会更改)。有没有办法在Golang中执行此操作,以便在创建运行时之前不知道其值是否已知的常量?提前谢谢!
答案 0 :(得分:6)
go中的常量在编译时设置,请参阅此处文档中的相关部分:https://golang.org/doc/effective_go.html#constants
Go中的常量只是常量。它们是在编译时创建的,即使在函数中定义为locals时也是如此,并且只能是数字,字符(符文),字符串或布尔值。由于编译时限制,定义它们的表达式必须是常量表达式,可由编译器评估。例如,1<<< 3是常量表达式,而math.Sin(math.Pi / 4)不是因为函数调用math.Sin需要在运行时发生。
答案 1 :(得分:3)
不,这是不可能的。常量只能保存编译时已知的字符串和数字。
答案 2 :(得分:3)
如上所述,在语言规范或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}
}
您可以使用Immutable
类似于构造函数的函数创建New()
的值,并且在包wrapper
之外的 no * * 将能够修改包裹int
值(Immutable.value
)。
(*注意:没有人表示没有人不接触包unsafe
,但这不算数。即使在Java中,您也可以更改final
的值使用Java反射的属性。)
答案 3 :(得分:0)
一种方法是使用未导出的结构并定义专门使用该未导出类型的函数。
// ./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))
}
答案 4 :(得分:0)
您可以在运行时使用匿名函数来充当常量,如下所示:
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)
}