Определение и использование структур
Литералы структур, доступ к полям и встраивание
«Определение и использование структур» — бесплатный урок Go Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.
Что такое структура?
Структура объединяет связанные поля разных типов в один именованный тип. Это основной механизм Go для определения пользовательских структур данных — аналог класса, но без наследования.
Объявление структуры
Определите тип структуры с помощью ключевого слова type:
package main
import "fmt"
type Person struct {
Name string
Age int
City string
}
func main() {
p := Person{Name: "Alice", Age: 30, City: "London"}
fmt.Println(p)
}Литералы структур
Два стиля: с именованными полями (предпочтительный) и позиционный (зависит от порядка и ненадёжен):
package main
type Point struct{ X, Y int }
func main() {
p1 := Point{X: 1, Y: 2} // named — preferred
p2 := Point{3, 4} // positional — avoid in non-test code
_ = p1; _ = p2
}Доступ к полям
Используйте точечную нотацию для чтения и записи полей:
package main
import "fmt"
type Car struct{ Brand string; Speed int }
func main() {
c := Car{Brand: "Tesla", Speed: 200}
fmt.Println(c.Brand) // Tesla
c.Speed = 250
fmt.Println(c.Speed) // 250
}Нулевое значение структуры
В нулевом значении структуры все поля имеют соответствующие нулевые значения. Его можно безопасно использовать без инициализации:
package main
import "fmt"
type Config struct{ Debug bool; Port int; Host string }
func main() {
var cfg Config
fmt.Println(cfg) // {false 0 }
cfg.Port = 8080
fmt.Println(cfg) // {false 8080 }
}Сравнение структур
Структуры можно сравнивать с помощью ==, если сравнимы все их поля:
package main
import "fmt"
type Point struct{ X, Y int }
func main() {
a := Point{1, 2}
b := Point{1, 2}
c := Point{3, 4}
fmt.Println(a == b) // true
fmt.Println(a == c) // false
}Структуры — типы-значения
При присваивании структуры копируются все её поля. Изменения копии не влияют на оригинал:
package main
import "fmt"
type Rect struct{ W, H int }
func main() {
r1 := Rect{10, 20}
r2 := r1
r2.W = 99
fmt.Println(r1) // {10 20}
fmt.Println(r2) // {99 20}
}Вложенные структуры
Полем структуры сама может быть структура:
package main
import "fmt"
type Address struct{ City, Country string }
type Employee struct {
Name string
Age int
Address Address
}
func main() {
e := Employee{Name: "Bob", Age: 28, Address: Address{"Berlin", "DE"}}
fmt.Println(e.Address.City) // Berlin
}Экспортируемые и неэкспортируемые поля
Поля, начинающиеся с прописной буквы, являются экспортируемыми (общедоступными). Поля со строчной буквы являются неэкспортируемыми (доступными только внутри пакета):
package main
type config struct {
host string // unexported
Port int // exported
}
func main() {
c := config{host: "localhost", Port: 8080}
_ = c
}Теги структур
Теги структур содержат метаданные, например для кодирования JSON. Это строковые литералы, расположенные после типа поля:
package main
type User struct {
ID int `json:"id"`
Name string `json:"name"`
Email string `json:"email,omitempty"`
}
func main() { _ = User{} }Быстрая проверка
Каково нулевое значение поля типа bool в структуре?
Повторение: структуры
Основные выводы:
- Структуры объединяют связанные поля в именованный тип
- Используйте литералы с именованными полями — избегайте позиционных
- Структуры являются типами-значениями — присваивание создаёт копию
- Поля, начинающиеся с прописной буквы, являются экспортируемыми
- Теги структур добавляют метаданные для библиотек вроде encoding/json
Задание для практики
Определите структуру Product с полями Name string, Price float64 и InStock bool. Создайте два экземпляра, сравните их с помощью == и выведите результат.
Часто задаваемые вопросы
Урок «Определение и использование структур» бесплатный?
Да — полный текст урока «Определение и использование структур» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.
Чему я научусь в уроке «Определение и использование структур»?
Литералы структур, доступ к полям и встраивание Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Go Academy?
Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Определение и использование структур»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Go Academy?
Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Определение и использование структур
- Методы структур
- Шаблоны конструкторов
- Анонимные структуры и композиция