Экспортируемые и неэкспортируемые имена
Часть раздела Объектно-ориентированное программирование путешествия по GO на Coddy — урок 4 из 107.
В Go первая буква имени определяет его видимость. Имена, начинающиеся с заглавной буквы, являются экспортируемыми (доступными из других пакетов). Имена, начинающиеся со строчной буквы, являются неэкспортируемыми (скрытыми внутри пакета).
Экспортируемые имена — видимы за пределами пакета
type User struct {
Name string // Экспортируемое поле
Email string // Экспортируемое поле
}
func CreateUser(name string) User { // Экспортируемая функция
return User{Name: name}
}Неэкспортируемые имена — видимы только внутри пакета
type secret struct { // Неэкспортируемая структура
password string // Неэкспортируемое поле
}
func validate() bool { // Неэкспортируемая функция
return true
}Смешанный тип — экспортируемая структура с некоторыми неэкспортируемыми полями
type Account struct {
Username string // Экспортируемое — доступно везде
Email string // Экспортируемое — доступно везде
password string // Неэкспортируемое — только внутри пакета
}Это соглашение об именовании заменяет модификаторы доступа, такие как public и private, встречающиеся в других языках.
// Заглавная буква = Экспортируемый (публичный)
// Строчная буква = Неэкспортируемый (приватный)
func SaveData() {} // Экспортируемый
func loadData() {} // НеэкспортируемыйСоблюдение этого соглашения имеет важное значение в Go. Когда другие пакеты импортируют ваш код, они могут получить доступ только к именам, начинающимся с заглавной буквы.
Задание
СреднеИсправьте все имена в product.go, чтобы они соответствовали соглашению об именовании экспортируемых сущностей в Go. Сделайте заглавной первую букву в:
- Имени структуры:
product→Product - Всех именах полей:
name,price,stock - Всех именах функций:
totalValue,displayInfo - Всех ссылках на поля внутри функций
Шпаргалка
В Go первая буква имени определяет его видимость:
- Заглавная буква = Экспортируемое (доступно из других пакетов)
- Строчная буква = Неэкспортируемое (приватное для пакета)
Экспортируемые имена:
type User struct {
Name string // Экспортируемое поле
Email string // Экспортируемое поле
}
func CreateUser(name string) User { // Экспортируемая функция
return User{Name: name}
}Неэкспортируемые имена:
type secret struct { // Неэкспортируемая структура
password string // Неэкспортируемое поле
}
func validate() bool { // Неэкспортируемая функция
return true
}Смешанная видимость:
type Account struct {
Username string // Экспортируемое — доступно везде
Email string // Экспортируемое — доступно везде
password string // Неэкспортируемое — только внутри пакета
}Это соглашение об именовании заменяет модификаторы доступа, такие как public и private, встречающиеся в других языках.
Попробуйте сами
package main
import "fmt"
func main() {
var name string
var price float64
var stock int
fmt.Scan(&name, &price, &stock)
p := Product{
Name: name,
Price: price,
Stock: stock,
}
fmt.Println(DisplayInfo(p))
fmt.Printf("Total Value: %.2f\n", TotalValue(p))
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП в Go
Внешние файлыРабочее пространство и модули GoПакеты и импортыЭкспортируемые и неэкспортируемые именаВведение в ООП в GoСтруктуры как классыОпределение методов структурПолучатели-указатели и получатели-значенияИнициализация структурФункции-конструкторыИтоги — Простой калькулятор4Интерфейсы
Введение в интерфейсыНеявная реализацияИнтерфейс как контрактПустой интерфейс (any)Утверждение типаПереключатель типовКомпозиция интерфейсовИнтерфейсы Stringer и ErrorПовторение: Калькулятор фигур7Инкапсуляция
Экспортируемые и неэкспортируемые поляИнкапсуляция на уровне пакетовГеттеры и сеттерыСокрытие информации в GoИтоги — Записи о студентах10Обобщения (Generics) (Go 1.18+)
Введение в GenericsПараметры типовОграничения типовОбобщенные структурыОбходной путь для обобщенных методовИтоги — Обобщенная коллекция13Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн Abstract FactoryПаттерн ObserverПаттерн Strategy2Глубокое погружение в типы и структуры
Базовые и составные типыОпределение пользовательских типовТеги структурАнонимные структурыВложенные структурыНулевые значения и значения по умолчаниюПовторение — Контактная книга5Композиция вместо наследования
Почему в Go нет наследованияОсновы встраивания структурПродвижение методовВстраивание нескольких структурВстраивание против агрегацииЗатенение встроенных методовИтоги — Иерархия сотрудников8Обработка ошибок и ООП
Интерфейс errorПользовательские типы ошибокОбертывание ошибок (fmt.Errorf)Sentinel-ошибкиerrors.Is() и errors.As()Panic, Defer и RecoverИтоги — Парсер файлов11Стандартная библиотека и ООП
io.Reader и io.Writersort.InterfaceИнтерфейс fmt.Stringerencoding/json со структурамиИнтерфейс http.HandlerПовторение: модели REST API14Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикMiddleware как Декоратор3Указатели и память
Основы указателей в GoУказатели на структурыПередача по значению и по ссылкеФункция new()Сборка мусора в GoПовторение: Конструктор связного списка6Полиморфизм в Go
Полиморфизм через интерфейсыУтиная типизация в GoПравила реализации интерфейсовПолиморфные коллекцииВнедрение зависимостейИтоги — Обработчик платежей9Конкурентность и ООП
Основы горутинКаналы и взаимодействиеБуферизованные и небуферизованные каналыОператор selectsync.Mutex и sync.RWMutexsync.WaitGroupПроектирование потокобезопасных структурПовторение — Worker Pool