Александр Гольцман
Регистры в Go
В языке Go регистр символов в именах переменных, функций и структур имеет особое значение. Он влияет не только на стиль написания кода, но и на область видимости сущностей внутри пакетов. В этой статье я расскажу, как работает система регистров в Go, какие правила используются для именования и как можно изменять регистр строк при обработке данных.
Регистры и область видимости
Смотрите, в Go доступность переменной, функции или структуры напрямую зависит от её имени.
- Если имя начинается с заглавной буквы, то эта сущность доступна за пределами пакета (экспортируется).
- Если имя начинается со строчной буквы, оно остаётся доступным только внутри текущего пакета.
Пример:
package mypackage
// Экспортируемая функция
func PublicFunction() {
// Доступна за пределами пакета
}
// Неэкспортируемая функция
func privateFunction() {
// Доступна только внутри пакета mypackage
}
Здесь PublicFunction
можно вызвать из другого пакета, а privateFunction
останется скрытой.
Тот же принцип применяется к структурам и их полям:
type User struct {
Name string // Экспортируемое поле
email string // Неэкспортируемое поле
}
Поле Name
будет доступно вне пакета, а email
— нет.
Изменение регистра строк
Иногда в коде нужно преобразовывать строки из одного регистра в другой. В стандартной библиотеке Go для этого есть пакет strings
:
strings.ToUpper(s string) string
— переводит строку в верхний регистр.strings.ToLower(s string) string
— переводит строку в нижний регистр.strings.Title(s string) string
(устаревший) — делает заглавной первую букву каждого слова.cases.Title(language.Und, cases.NoLower)
(изgolang.org/x/text/cases
) — современная альтернативаstrings.Title
.
Пример:
import (
"fmt"
"strings"
)
func main() {
str := "hello, world"
fmt.Println(strings.ToUpper(str)) // "HELLO, WORLD"
fmt.Println(strings.ToLower(str)) // "hello, world"
}
Если вам нужно корректно форматировать строки с учётом локализации, лучше использовать пакет golang.org/x/text/cases
.
CamelCase и snake_case в Go
Go не навязывает строгих правил именования, но есть общепринятые стили:
- CamelCase (
MyVariable
,NewFunction
) используется для экспортируемых сущностей. - camelCase (
myVariable
,privateFunction
) применяется для внутренних элементов. - snake_case (
my_variable
,process_data
) в Go не используется в именах переменных, но может встречаться в JSON, конфигурациях и базах данных.
Если вам нужно преобразовать строку между разными стилями, можно использовать сторонние библиотеки, например github.com/iancoleman/strcase
.
Пример работы с strcase
:
import (
"fmt"
"github.com/iancoleman/strcase"
)
func main() {
fmt.Println(strcase.ToSnake("MyVariable")) // "my_variable"
fmt.Println(strcase.ToCamel("my_variable")) // "MyVariable"
}
Заключение
В Go регистр имеет значение не только для читаемости кода, но и для его структуры. Здесь я показал, как он влияет на область видимости переменных и функций, какие есть методы для изменения регистра строк и какие стили именования приняты в сообществе Go-разработчиков.
Если вы разрабатываете пакеты, следите за тем, какие имена экспортируются, а какие остаются внутри. А при обработке строк используйте стандартные методы strings.ToUpper
, strings.ToLower
, а для сложных случаев — golang.org/x/text/cases
.