Бесплатный курс по Go. Зарегистрируйтесь для отслеживания прогресса →

Go: Константы

Константы — это постоянные значения, которые инициализируются один раз и не изменяются в течение всего выполнения программы. В Go константы объявляются через ключевое слово const:

const [название] [тип данных] = [значение]

const StatusOk int = 200

На практике тип данных не указывается, и несколько констант принято объявлять в рамках одного блока const:

const (
    StatusOk = 200
    StatusNotFound = 404
)

Только некоторые типы данных можно присвоить константе: строки, символы, числа, логический тип:

package main

type Person struct {
}

func main() {
    // такие константы допустимы
    const (
        num = 20
        str = "hey"
        isValid = true
    )

    // нельзя объявить структуру как константу
    const p = Person{} // ошибка компиляции: const initializer Person{} is not a constant
}

Регистр первой буквы указывает на публичность/приватность константы:

const (
    // публичная константа, которую можно использовать во внешних пакетах
    StatusOk = 200

    // приватная константа, доступная только в рамках текущего пакета
    statusInternalError = 500
)

Константы можно объявлять на уровне функции, либо пакета:

package main

import "fmt"

const defaultStatus = 200

func main() {
    const status = 404

    fmt.Println("default status:", defaultStatus) // default status: 200
    fmt.Println("current status:", status) // current status: 404
}

Для последовательных числовых констант следует использовать идентификатор iota, который присвоит для списка чисел значения от его текущей позиции:

package main

import "fmt"

const (
    zero = iota
    one
    two
    three
)

const (
a = iota
b = 42
c = iota
d
)

func main() {
fmt.Println(zero, one, two, three) // 0 1 2 3
fmt.Println(a, b, c, d)            // 0 42 2 3
}

Задание

В больших проектах часто используется gRPC — высокопроизводительный RPC (Remote Procedure Call)-фреймворк для коммуникации между микросервисами. Ошибки в gRPC стандартизированы и представлены в виде строк для пользователя, либо в виде чисел для компьютера.

Представим, что нам нужно написать конвертер ошибок в числовой формат для gRPC. Реализуйте функцию ErrorMessageToCode(msg string) int, которая возвращает числовой код для заданного значения. Список сообщений и соответствующих кодов:

OK = 0
CANCELLED = 1
UNKNOWN = 2

В реальности список намного шире. Мы для простоты ограничимся тремя ошибками. Учтите, что если в функцию передать неизвестную ошибку, она должна вернуть код ошибки для сообщения UNKNOWN.

Упражнение не проходит проверку — что делать? 😶

Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:

  • Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.
В моей среде код работает, а здесь нет 🤨

Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.

Мой код отличается от решения учителя 🤔

Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.

В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.

Прочитал урок — ничего не понятно 🙄

Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.

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

Полезное


Нашли ошибку? Есть что добавить? Пулреквесты приветствуются https://github.com/hexlet-basics
Если вы столкнулись с трудностями и не знаете, что делать, задайте вопрос в нашем большом и дружном сообществе