Постоянные значения глобального пользовательского типа в Go - PullRequest
1 голос
/ 30 мая 2019

Я хочу организовать вычисление значения, которое не изменится после инициализации.

Я бы использовал const, но Go ограничивает константы встроенными типами, 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
}

Что довольно хорошо - но есть ли способ «заблокировать» значения после вычисления, кроме как заменить переменные на неэкспортированные имена, а затем использовать функции доступа к функциям для возврата их значений?

Ответы [ 2 ]

5 голосов
/ 30 мая 2019

Нет, нет. Переменные называются так потому, что их значения могут быть изменены. В Go нет «финального» или подобного модификатора. Простота языка.

Единственный способ защитить переменную от изменения извне - сделать ее неэкспортированной, и да, тогда вам нужны экспортированные функции для получения их значений.

Обходной путь может заключаться в том, чтобы использовать не переменные, а константы. Да, у вас не может быть структурных констант, но если структуры маленькие, вы можете использовать их поля как отдельные константы, например ::

const (
    ScreenMinX = ScreenWidth / 2
    ScreenMinY = ScreenHeight / 2
    ScreenMaxX = ScreenWidth
    ScreenMaxY = ScreenHeight
)
1 голос
/ 30 мая 2019

В качестве опции вы можете переместить эти "константы"

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

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

в отдельный пакет и определить их как неэкспортируемые , а также определить функцию экспортируемую , напримерthis:

func GetScreenBounds() types.SomeType {
 return screenBounds
}

Это некоторые издержки, но они предоставят вам возможность безопасно использовать эти константы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...