Расскажите о соглашениях по именованию (naming conventions) в Go.

Ответ

Да, в Go существуют строгие и идиоматичные соглашения по именованию, которые влияют даже на логику работы программы.

Ключевое правило — видимость (экспорт) идентификатора определяется первой буквой имени.

  1. Публичные (экспортируемые) сущности:

    • Имена начинаются с заглавной буквы (PascalCase).
    • Такие переменные, константы, типы и функции доступны из других пакетов.
    • Пример: var MaxConnections int, func GetUser(id int) User.
  2. Приватные (неэкспортируемые) сущности:

    • Имена начинаются со строчной буквы (camelCase).
    • Доступны только внутри того пакета, где они определены.
    • Пример: var maxConnections int, func getUser(id int) user.

Другие важные соглашения:

  • Пакеты: Имена пакетов должны быть короткими, лаконичными и в нижнем регистре. Например, http, json, fmt.
  • Интерфейсы: Имена интерфейсов, состоящих из одного метода, принято называть, добавляя к имени метода суффикс -er. Например, Reader, Writer, Stringer.
  • Константы: Используется PascalCase, как и для других экспортируемых сущностей. Использование SNAKE_CASE не является идиоматичным для Go.
  • Тестовые файлы и функции: Файлы должны заканчиваться на _test.go. Тестовые функции должны начинаться с префикса Test, например, func TestCalculateTotal(t *testing.T).

Пример:

package config

// MaxRetries - экспортируемая константа.
const MaxRetries = 3

// User - экспортируемая структура.
type User struct {
    ID   int    // Публичное поле
    name string // Приватное поле
}

// NewUser - публичная функция-конструктор.
func NewUser(id int, name string) *User {
    return &User{ID: id, name: name}
}

// getName - приватный метод.
func (u *User) getName() string {
    return u.name
}