Поля структуры

Поля структуры в Go — это компоненты, определяющие набор данных, которые может хранить структура. Каждое поле имеет имя и тип. Доступ к полям осуществляется через оператор точки . после переменной структуры. Поля могут быть экспортируемыми (с большой буквы) или неэкспортируемыми (с маленькой), что определяет их видимость за пределами пакета.

Объявление полей структуры

Поля объявляются внутри определения структуры. Каждое поле задается именем и типом. Имена полей должны быть уникальными в пределах структуры. Рассмотрим пример структуры с несколькими полями:

gopackage main

import "fmt"

type Person struct {
  Name string
  Age  int
  City string
}

func main() {
  p := Person{Name: "Alice", Age: 30, City: "New York"}
  fmt.Println(p)
}

Результат выполнения кода:

go{Alice 30 New York}

В этом примере структура Person содержит три поля: Name типа string, Age типа int и City типа string.

Доступ к полям структуры

Для доступа к полям используется оператор точки .. Можно как читать значение поля, так и изменять его. Рассмотрим пример:

gopackage main

import "fmt"

type Book struct {
  Title  string
  Author string
  Pages  int
}

func main() {
  b := Book{Title: "1984", Author: "Orwell", Pages: 328}
  fmt.Println("Title:", b.Title)
  fmt.Println("Author:", b.Author)

  b.Pages = 400
  fmt.Println("Updated pages:", b.Pages)
}

Результат выполнения кода:

go"Title: 1984"
"Author: Orwell"
"Updated pages: 400"

В этом примере мы сначала читаем значения полей Title и Author, а затем изменяем значение поля Pages.

Экспортируемые и неэкспортируемые поля

Если имя поля начинается с заглавной буквы, оно экспортируется и доступно из других пакетов. Если с маленькой — поле является приватным для текущего пакета. Рассмотрим пример:

gopackage main

import "fmt"

type User struct {
  Username string // экспортируемое поле
  password string // неэкспортируемое поле
}

func main() {
  u := User{Username: "john_doe", password: "secret"}
  fmt.Println("Username:", u.Username)
  // fmt.Println("Password:", u.password) // Ошибка: поле password не экспортируется
}

Результат выполнения кода:

go"Username: john_doe"

В этом примере поле Username экспортируется и доступно для чтения, а поле password недоступно за пределами пакета.

Нулевые значения полей

Если поле не инициализировано явно, оно получает нулевое значение для своего типа. Например, для строк это пустая строка, для чисел — 0. Рассмотрим пример:

gopackage main

import "fmt"

type Product struct {
  Name  string
  Price float64
  InStock bool
}

func main() {
  var p Product
  fmt.Printf("Name: %q, Price: %.2f, InStock: %t\n", p.Name, p.Price, p.InStock)
}

Результат выполнения кода:

go"Name: "", Price: 0.00, InStock: false"

Как видно из примера, все поля получили нулевые значения: пустая строка, 0 и false.

Сравнение структур с полями

Структуры можно сравнивать, если все их поля сравнимы между собой. Рассмотрим пример:

gopackage main

import "fmt"

type Point struct {
  X int
  Y int
}

func main() {
  p1 := Point{X: 10, Y: 20}
  p2 := Point{X: 10, Y: 20}
  p3 := Point{X: 5, Y: 5}

  fmt.Println("p1 == p2:", p1 == p2)
  fmt.Println("p1 == p3:", p1 == p3)
}

Результат выполнения кода:

go"p1 == p2: true"
"p1 == p3: false"

Структуры p1 и p2 равны, так как все их поля совпадают. p3 отличается, поэтому сравнение дает false.

Смотрите также