Какую роль играет регистр первой буквы в именах идентификаторов (переменных, функций, методов, типов) в Go?

Ответ

В Go регистр первой буквы идентификатора (имени переменной, константы, типа, функции или метода) определяет его видимость за пределами пакета, в котором он объявлен. Это основной механизм инкапсуляции в языке.

  • Заглавная буква (Exported): Идентификатор доступен из других пакетов. Это называется «экспортируемый» идентификатор.
  • Строчная буква (Unexported): Идентификатор доступен только внутри своего пакета. Это «неэкспортируемый» или «приватный» для пакета идентификатор.

Пример:

package user

import "fmt"

// Person - экспортируемая структура, т.к. начинается с заглавной буквы.
// Ее можно будет импортировать и использовать в пакете main.
type Person struct {
    // Name - экспортируемое поле, доступно из других пакетов.
    Name string
    // age - неэкспортируемое поле, доступно только внутри пакета user.
    age  int
}

// NewPerson - экспортируемая функция-конструктор.
func NewPerson(name string, age int) *Person {
    return &Person{Name: name, age: age}
}

// printAge - неэкспортируемый метод, его нельзя вызвать из пакета main.
func (p *Person) printAge() {
    fmt.Printf("Возраст: %dn", p.age)
}

// Introduce - экспортируемый метод, доступен из других пакетов.
func (p *Person) Introduce() {
    fmt.Printf("Привет, меня зовут %s.n", p.Name)
    p.printAge() // Внутренний вызов неэкспортируемого метода
}

Ключевые моменты:

  • Это правило применяется ко всем идентификаторам: переменным, константам, типам, функциям и методам.
  • Внутри одного пакета разницы в доступе между экспортируемыми и неэкспортируемыми идентификаторами нет.