首页 > 解决方案 > Go 中的常量全局用户类型值

问题描述

我想安排计算一个在初始化后不会改变的值。

我会使用 const,但 Go 将 const 限制为内置类型 IIUC。

所以我想我会使用var, 并计算它们的初始值init()

var (
    // ScreenBounds is the visible screen
    ScreenBounds types.Rectangle

    // BoardBounds is the total board space
    BoardBounds  types.Rectangle
)

func init() {
    ScreenBounds := types.RectFromPointSize(
        types.Pt(-ScreenWidth/2, 0),
        types.Pt(ScreenWidth, ScreenHeight))

    BoardBounds := ScreenBounds
    BoardBounds.Max.Y += TankSpeed * TotalFrames
}

哪个很好 - 但是有没有办法在计算后“锁定”值,而不是将变量更改为未导出的名称,然后使用函数访问器返回它们的值?

标签: gostaticconstantsinitidioms

解决方案


不,那里没有。变量之所以这样称呼,是因为它们的值可以更改。在 Go 中没有“final”或类似的修饰符。语言的简单性。

防止从外部更改变量的唯一方法是使其不导出,是的,那么您需要导出函数来获取它们的值。

一种解决方法可能是不使用变量而是使用常量。是的,你不能有结构常量,但如果结构很小,你可以使用它的字段作为单独的常量,例如:

const (
    ScreenMinX = ScreenWidth / 2
    ScreenMinY = ScreenHeight / 2
    ScreenMaxX = ScreenWidth
    ScreenMaxY = ScreenHeight
)

推荐阅读