Golang: Константы
Константы — это значения, которые объявляются один раз и не могут быть изменены во время выполнения программы. Они удобны для хранения фиксированных значений, таких как статусы, пороговые значения или конфигурационные параметры.
Константы в Go объявляются с помощью ключевого слова const
. Синтаксис:
const name type = value
Тип указывать не обязательно — он будет выведен автоматически:
const greeting = "Hello, Hexlet"
const age = 10
Несколько констант можно объединить в один блок:
const (
StatusOK = 200
StatusNotFound = 404
)
Публичность и приватность
Как и функции, переменные и другие идентификаторы, первая буква имени влияет на область видимости:
const (
// экспортируемая (публичная) константа — доступна из других пакетов
StatusOK = 200
// неэкспортируемая (приватная) — доступна только внутри текущего пакета
statusInternalError = 500
)
Область видимости
Константы могут быть объявлены как на уровне пакета, так и внутри функции:
package main
import "fmt"
const defaultStatus = 200 // пакетная область
func main() {
const status = 404 // локальная область
fmt.Println(defaultStatus) // => 200
fmt.Println(status) // => 404
}
Автоматическая нумерация с iota
Если нужно создать набор последовательных чисел, можно использовать iota. Это встроенный идентификатор, значение которого увеличивается на единицу в рамках блока const
.
const (
RoleGuest = iota // 0
RoleUser // 1
RoleAdmin // 2
RoleSuperAdmin // 3
)
Задание
В больших проектах часто используется gRPC — высокопроизводительный RPC (Remote Procedure Call)-фреймворк для коммуникации между микросервисами. Ошибки в gRPC стандартизированы и представлены в виде строк для пользователя, либо в виде чисел для компьютера.
Представим, что нам нужно написать конвертер ошибок в числовой формат для gRPC. Реализуйте функцию ErrorMessageToCode(msg string) int
, которая возвращает числовой код для заданного значения. Список сообщений и соответствующих кодов:
OK = 0
CANCELLED = 1
UNKNOWN = 2
В реальности список намного шире. Мы для простоты ограничимся тремя ошибками. Учтите, что если в функцию передать неизвестную ошибку, она должна вернуть код ошибки для сообщения UNKNOWN.
Полезное
Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект
Если вы зашли в тупик, то самое время поговорить с нашим асситентом Тота во вкладке "ИИ-помощник":
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи. В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в обратной связи нашего сообщества
Ваше упражнение проверяется по этим тестам
package solution
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestErrorMessageToCode(t *testing.T) {
a := assert.New(t)
a.Equal(0, ErrorMessageToCode("OK"))
a.Equal(1, ErrorMessageToCode("CANCELLED"))
a.Equal(2, ErrorMessageToCode("UNKNOWN"))
a.Equal(2, ErrorMessageToCode("err"))
}
Решение учителя откроется через:
20:00
