Правила именования идентификаторов
Краткое описание
В этом уроке изучаем правила именования переменных, функций и других сущностей в Go. Разбираем, какие символы разрешены в идентификаторах, почему нельзя использовать ключевые слова, и учимся давать осмысленные имена переменным согласно best practices языка.
Ключевые концепции
Что такое идентификатор
Идентификатор — это имя, которое программист даёт переменной, функции, типу или другой сущности в программе. В Go идентификаторы должны соответствовать строгим правилам.
Регистрозависимость
Go чувствителен к регистру — переменные с разным регистром букв считаются разными:
var value int = 10
var Value int = 20
var VALUE int = 30
// Это три разные переменные!
fmt.Printf("value=%d, Value=%d, VALUE=%d\n", value, Value, VALUE)
Более того, регистр первой буквы определяет видимость:
- Заглавная буква → экспортируемая (public)
- Строчная буква → неэкспортируемая (private)
Правила именования идентификаторов
Разрешено
1. Начинать с буквы Unicode (верхний или нижний регистр):
var age int = 25
var Age int = 30
var firstName string = "Иван"
2. Начинать с символа подчёркивания _:
var _private int = 100
var _temp string = "temporary"
Обычно используется для приватных или временных переменных.
3. Содержать цифры (но не на первой позиции):
var userName123 string = "user"
var value2 int = 42
var param1 string = "test"
4. Unicode символы (кириллица, иероглифы):
var температура int = 20 // кириллица
var 年齢 int = 30 // китайские иероглифы
var имя string = "Сергей"
Важно: хотя технически это разрешено, использовать не латинские символы не рекомендуется в реальных проектах. Это не стандарт индустрии, и коллеги могут не оценить.
Запрещено
1. Начинать с цифры:
// var 123name string = "error" // ОШИБКА!
// var 1stPlace int = 1 // ОШИБКА!
2. Использовать дефис -:
// var my-name string = "error" // ОШИБКА!
// var user-id int = 100 // ОШИБКА!
Вместо дефиса используйте camelCase: myName, userId.
3. Использовать эмодзи и специальные символы:
// var 😳 string = "emoji" // ОШИБКА!
// var user@name string = "error" // ОШИБКА!
4. Использовать ключевые слова Go:
// var for int = 10 // ОШИБКА! 'for' зарезервировано
// var func string = "error" // ОШИБКА! 'func' зарезервировано
// var if bool = true // ОШИБКА! 'if' зарезервировано
Ключевые слова Go
В Go 25 зарезервированных ключевых слов, которые нельзя использовать как идентификаторы:
break default func interface select
case defer go map struct
chan else goto package switch
const fallthrough if range type
continue for import return var
Где найти список: Go Specification → Keywords
Обход ограничения: если нужно использовать похожее имя, можно изменить регистр:
// var else int = 10 // ОШИБКА!
var Else int = 10 // OK (но не рекомендуется)
Хотя технически это работает, давать переменным имена ключевых слов с заглавной буквы — плохая практика.
Best practices именования
Используйте осмысленные имена
Плохо:
var fn string = "Иван"
var a int = 25
var x float64 = 99.99
Хорошо:
var firstName string = "Иван"
var age int = 25
var price float64 = 99.99
camelCase для составных имён
В Go принято использовать camelCase без разделителей:
var userName string = "admin"
var totalStudentsCount int = 150
var averageTemperatureInCelsius float64 = 22.5
Длинные имена — это нормально
Не бойтесь длинных, но понятных имён:
var maxConnectionRetries int = 3
var httpRequestTimeout time.Duration = 30 * time.Second
var databaseConnectionString string = "postgres://..."
Лучше длинное и понятное имя, чем короткое и загадочное.
Короткие имена для локальных переменных
В небольших областях видимости допустимы короткие имена:
for i := 0; i < 10; i++ {
// i — понятно из контекста
}
if err := doSomething(); err != nil {
// err — стандартное соглашение
}
Контекст важнее длины
Если контекст понятен, можно использовать короткие имена:
// В функции работы с пользователями
func GetUser(id int) User {
// id понятно из контекста
}
// В математической функции
func CalculateDistance(x1, y1, x2, y2 float64) float64 {
// координаты понятны
}
Практика
Полный пример из урока
package main
import "fmt"
func main() {
// Правильные идентификаторы
var age int = 25
var firstName string = "Сергей"
var _private int = 100
var userName123 string = "user"
var температура int = 20 // Unicode (не рекомендуется)
var 年齢 int = 30 // Иероглифы (не рекомендуется)
fmt.Println(age, firstName, _private, userName123, температура, 年齢)
// Регистрозависимость
var value int = 10
var Value int = 20
var VALUE int = 30
fmt.Printf("value=%d, Value=%d, VALUE=%d\n", value, Value, VALUE)
// Длинные описательные имена (рекомендуется)
var totalStudentsCount int = 150
var averageTemperatureInCelsius float64 = 22.5
fmt.Println(totalStudentsCount, averageTemperatureInCelsius)
// НЕПРАВИЛЬНЫЕ идентификаторы (не компилируются):
// var 123name string = "error" // цифра в начале
// var my-name string = "error" // дефис
// var 😳 string = "emoji" // эмодзи
// var for int = 10 // ключевое слово
// var func string = "error" // ключевое слово
}
Примеры хороших имён
// Переменные
var userAge int = 25
var isActive bool = true
var maxRetryCount int = 3
// Константы (PascalCase или UPPER_CASE)
const MaxConnections = 100
const DefaultTimeout = 30
// Функции
func CalculateTotal() int { }
func GetUserByID(id int) User { }
// Типы
type UserAccount struct { }
type RequestHandler interface { }
Важные моменты
1. Используйте латиницу Хотя Unicode поддерживается, в профессиональной разработке используйте только латинские буквы. Это стандарт индустрии и требование большинства code review процессов.
2. Не злоупотребляйте подчёркиванием
Переменные с _ в начале имеют специфичное значение (обычно private/internal). Используйте их осознанно.
3. Проверяйте ключевые слова Перед использованием незнакомого имени убедитесь, что это не ключевое слово. Список всегда доступен в Go Specification.
4. Контекст определяет длину
- Глобальные переменные → длинные описательные имена
- Локальные переменные в малом scope → можно короче
- Цикловые счётчики →
i,j,k
5. Соглашения команды важнее Даже если правила Go что-то разрешают, в проекте могут быть свои стандарты. Всегда изучайте code style проекта при входе в команду.
6. Go fmt не исправит имена
gofmt форматирует код, но не меняет имена переменных. Ответственность за осмысленные имена лежит на программисте.
7. Экспорт через регистр
var Public int = 10 // доступна вне пакета
var private int = 20 // только внутри пакета
Это уникальная особенность Go — видимость определяется регистром, а не ключевыми словами.
Что запомнить
- Идентификатор — имя переменной, функции, типа
- Должен начинаться с буквы (Unicode) или
_ - Может содержать цифры (но не в начале)
- Нельзя: начинать с цифры, использовать дефисы, эмодзи, ключевые слова
- Go регистрозависимый:
value≠Value≠VALUE - 25 ключевых слов нельзя использовать (
for,func,if,varи др.) - Unicode разрешён, но не рекомендуется в реальных проектах
- Используйте camelCase для составных имён
- Длинные осмысленные имена лучше коротких загадочных
- Заглавная буква → public, строчная → private
- Следуйте code style проекта/команды
- Список ключевых слов: Go Specification → Keywords