0Pricing
Go Academy · Урок

Определение и использование структур

Литералы структур, доступ к полям и встраивание

«Определение и использование структур» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Определение и использование структур
  2. Методы структур
  3. Шаблоны конструкторов
  4. Анонимные структуры и композиция
← Назад к Go Academy