Ответ
В 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() // Внутренний вызов неэкспортируемого метода
}
Ключевые моменты:
- Это правило применяется ко всем идентификаторам: переменным, константам, типам, функциям и методам.
- Внутри одного пакета разницы в доступе между экспортируемыми и неэкспортируемыми идентификаторами нет.