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

Наименования переменных, функций и структур в Go

Автор

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

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

Наименования и область видимости

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

  • Экспортируемые сущности начинаются с заглавной буквы (PublicFunction, User, ConfigPath) и доступны за пределами пакета.
  • Неэкспортируемые сущности начинаются со строчной буквы (privateFunction, user, configPath) и остаются доступными только внутри текущего пакета.

Пример:

package mypackage

// Экспортируемая переменная
var PublicValue = 42

// Неэкспортируемая переменная
var privateValue = 10

Этот же принцип действует и для структур:

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

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

Стиль именования в Go

В Go приняты следующие соглашения:

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

Пример:

const MaxConnections = 100   // CamelCase для экспортируемых констант
const defaultTimeout = 30    // camelCase для внутренних констант

Go использует лаконичный стиль именования. Например, вместо getUserName() принято писать userName(), а вместо calculateTotalAmount()totalAmount().

Аббревиатуры и сокращения

При использовании аббревиатур в именах придерживайтесь следующих правил:

  • Если аббревиатура стоит в начале, она пишется с заглавной буквы (JSONParser, URLFetcher).
  • Если внутри имени, то только первая буква аббревиатуры заглавная (parseJson, fetchUrl).

Пример:

type HttpClient struct {}  // HTTP → Http
func parseJson() {}        // JSON → Json

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

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

  • strings.ToUpper(s string) string — переводит строку в верхний регистр.
  • strings.ToLower(s string) string — переводит строку в нижний регистр.

Пример:

import (
    "fmt"
    "strings"
)

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

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

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

Заключение

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

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

Стрелочка влевоNull, Nil, None, 0 в GoInt в 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
Открыть базу знаний