Golang中的运行时Const

时间:2016-01-27 00:43:22

标签: go constants

在某些语言中,例如Java和C ++,可以创建常量,然后在构造函数中分配它们的值(之后不会更改)。有没有办法在Golang中执行此操作,以便在创建运行时之前不知道其值是否已知的常量?提前谢谢!

5 个答案:

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

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