Расскажите о соглашениях по именованию (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
}

Ответ 18+ 🔞

Да ты посмотри, какая в Go, блядь, ебаная магия с именами! Это не просто "как назвать", это, сука, прямо в логику программы лезет, нах!

Вот смотри, главный прикол, от которого можно охуеть: видимость твоей хуйни зависит от первой буквы в имени. Да, ёпта, всё так просто и так пиздецово важно.

  1. Если хочешь, чтобы все видели (экспорт):

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

    • Начинай со строчной буквы, как скромная мартышлюшка (camelCase).
    • И тогда эта штука будет доступна только внутри твоего родного пакета, и никакой левый пидарас из соседнего main.go к ней не подберётся.
    • Пример: var maxConnections int, func getUser(id int) user. Маленькая буква — и всё, пиздец, невидимка.

А ещё там, блядь, куча других приколов:

  • Пакеты называй коротко и по-простому, в нижнем регистре: http, json, fmt. Не выёбывайся.
  • Интерфейсы, если в них один метод, называй так: имя метода + -er. Reader, Writer. Логично же, блядь!
  • Константы — тоже с большой буквы, если на экспорт. Забудь про SNAKE_CASE, это не питон тут, ёпта.
  • Тесты — это вообще отдельная религия. Файл должен называться *_test.go, а функция — TestЛюбоеНазвание(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 — а это приватный метод. Только внутри пакета `config` его можно вызвать.
// Снаружи про него нихуя не знают.
func (u *User) getName() string {
    return u.name
}

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