Golang中的运行时常量

15

在一些语言中,例如Java和C ++,可以创建常量,并在构造函数期间分配它们的值(然后在此之后不再更改)。是否有办法在Golang中做到这一点,以便可以创建一个直到运行时才知道值的常量?提前感谢!

5个回答

15

Go中的常量是在编译时设置的。请参阅文档中的相关部分:https://golang.org/doc/effective_go.html#constants

Go中的常量就是常量。即使在函数中定义为本地变量,它们也是在编译时创建的,并且只能是数字、字符(符文)、字符串或布尔值。由于受到编译时间限制,定义它们的表达式必须是常量表达式,可以由编译器计算出来。例如,1<<3是一个常量表达式,而math.Sin(math.Pi/4)不是,因为需要在运行时调用math.Sin函数。


4

如上所述,根据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属性的值。)

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))
}

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)
}

https://play.golang.org/p/Q0dGfwL_Y4P


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接