логотип PurpleSchool
логотип PurpleSchool

Регистры в Go

Автор

Александр Гольцман

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

Регистры и область видимости

Смотрите, в Go доступность переменной, функции или структуры напрямую зависит от её имени.

  • Если имя начинается с заглавной буквы, то эта сущность доступна за пределами пакета (экспортируется).
  • Если имя начинается со строчной буквы, оно остаётся доступным только внутри текущего пакета.

Пример:

package mypackage

// Экспортируемая функция
func PublicFunction() {
    // Доступна за пределами пакета
}

// Неэкспортируемая функция
func privateFunction() {
    // Доступна только внутри пакета mypackage
}

Здесь PublicFunction можно вызвать из другого пакета, а privateFunction останется скрытой.

Тот же принцип применяется к структурам и их полям:

type User struct {
    Name  string // Экспортируемое поле
    email string // Неэкспортируемое поле
}

Поле Name будет доступно вне пакета, а email — нет.

Изменение регистра строк

Иногда в коде нужно преобразовывать строки из одного регистра в другой. В стандартной библиотеке Go для этого есть пакет strings:

  • strings.ToUpper(s string) string — переводит строку в верхний регистр.
  • strings.ToLower(s string) string — переводит строку в нижний регистр.
  • strings.Title(s string) string (устаревший) — делает заглавной первую букву каждого слова.
  • cases.Title(language.Und, cases.NoLower) (из golang.org/x/text/cases) — современная альтернатива strings.Title.

Пример:

import (
    "fmt"
    "strings"
)

func main() {
    str := "hello, world"

    fmt.Println(strings.ToUpper(str)) // "HELLO, WORLD"
    fmt.Println(strings.ToLower(str)) // "hello, world"
}

Если вам нужно корректно форматировать строки с учётом локализации, лучше использовать пакет golang.org/x/text/cases.

CamelCase и snake_case в Go

Go не навязывает строгих правил именования, но есть общепринятые стили:

  • CamelCase (MyVariable, NewFunction) используется для экспортируемых сущностей.
  • camelCase (myVariable, privateFunction) применяется для внутренних элементов.
  • snake_case (my_variable, process_data) в Go не используется в именах переменных, но может встречаться в JSON, конфигурациях и базах данных.

Если вам нужно преобразовать строку между разными стилями, можно использовать сторонние библиотеки, например github.com/iancoleman/strcase.

Пример работы с strcase:

import (
    "fmt"

    "github.com/iancoleman/strcase"
)

func main() {
    fmt.Println(strcase.ToSnake("MyVariable")) // "my_variable"
    fmt.Println(strcase.ToCamel("my_variable")) // "MyVariable"
}

Заключение

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

Если вы разрабатываете пакеты, следите за тем, какие имена экспортируются, а какие остаются внутри. А при обработке строк используйте стандартные методы strings.ToUpper, strings.ToLower, а для сложных случаев — golang.org/x/text/cases.

Стрелочка влевоРабота с cookie в GolangКэширование данных в GolangСтрелочка вправо

Все гайды по Golang

Работа с YAML в GolangПреобразование типов в GolangКонвертация структур в JSON в GolangStrconv в GolangИспользование пакета SQLx для работы с базами данных в GolangРазбираемся с SQL в GolangРазделение строк с помощью функции split в GolangSort в GoПоиск и замена строк в Go - GolangИспользование пакета reflect в GolangРабота с PostgreSQL в GoPointers в GolangПарсинг в GoРабота со списками (list) в GolangПреобразование int в string в GolangРабота с числами с плавающей точкой в GolangРабота с полями в GolangИспользование enum в GolangОбработка JSON в GoЧтение и запись CSV-файлов в GolangРабота с cookie в GolangРегистры в GoКэширование данных в GolangПреобразование byte в string в GolangByte в GoИспользование bufio для работы с потоками данных в GolangДобавление данных и элементов (add) в Go
Логирование в Golang. Zap, Logrus, Loki, GrafanaРабота с Docker-контейнерами в GoИспользование pprof в GolangМеханизмы синхронизации в GolangРабота с пакетом S3 в GolangМониторинг Golang приложений с помощью PrometheusОптимизация проектов на GoПаттерны проектирования в GolangМиграции базы данных в GolangОркестрация контейнеров Go с Kubernetes + DockerGjGo Playground и компилятор GolangИспользование go mod init для создания модулей GolangРабота с переменными окружения (env) в GolangКоманда go build в GolangАвтоматизация Golang проектов — CI/CD с GitLab CI и JenkinsОтладка кода в GolangЧтение и использование конфигурации в приложениях на GolangКомпиляция в GolangКак развернуть Go-приложение на облаке AWSАутентификация в Golang
Сетевые протоколы в GoПеременные в GolangЗначения в GolangДженерик %T и его применение в GolangТипы данных в GolangИспользование tls в GolangИспользование tag в структурах GolangSwitch в GoСтроки в GolangРабота с потоками (stream) в GolangSelect в GoРуны в GoРабота с пакетом params в GolangКонвертация строк в числа в GolangNull, Nil, None, 0 в GoНаименования переменных, функций и структур в GoInt в GolangУстановка GolangЧтение и установка HTTP заголовков в GolangMethods в GolangGoLand — IDE для разработки на Golang от JetBrainsОбработка «not found» в GolangFloat в GolangФлаги командной строки в Go (Golang)Запуск внешних команд в GolangОбработка ошибок в GoИспользование defer в GolangЗначения default в GolangГенерация кода в GoФорматирование кода в GolangЧистая архитектура в GolangКаналы (channels) в GolangПолучение body из HTTP запроса в Golang
Открыть базу знаний