Ответ
Да, в Go существуют строгие и идиоматичные соглашения по именованию, которые влияют даже на логику работы программы.
Ключевое правило — видимость (экспорт) идентификатора определяется первой буквой имени.
Публичные (экспортируемые) сущности:
- Имена начинаются с заглавной буквы (
PascalCase). - Такие переменные, константы, типы и функции доступны из других пакетов.
- Пример:
var MaxConnections int,func GetUser(id int) User.
- Имена начинаются с заглавной буквы (
Приватные (неэкспортируемые) сущности:
- Имена начинаются со строчной буквы (
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
}