Поля структуры
Поля структуры в Go — это компоненты, определяющие набор данных, которые может хранить структура. Каждое поле имеет имя и тип. Доступ к полям осуществляется через оператор точки . после переменной структуры. Поля могут быть экспортируемыми (с большой буквы) или неэкспортируемыми (с маленькой), что определяет их видимость за пределами пакета.
Объявление полей структуры
Поля объявляются внутри определения структуры. Каждое поле задается именем и типом. Имена полей должны быть уникальными в пределах структуры. Рассмотрим пример структуры с несколькими полями:
package 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)
}
Результат выполнения кода:
{Alice 30 New York}
В этом примере структура Person содержит три поля: Name типа string, Age типа int и City типа string.
Доступ к полям структуры
Для доступа к полям используется оператор точки .. Можно как читать значение поля, так и изменять его. Рассмотрим пример:
package 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)
}
Результат выполнения кода:
"Title: 1984"
"Author: Orwell"
"Updated pages: 400"
В этом примере мы сначала читаем значения полей Title и Author, а затем изменяем значение поля Pages.
Экспортируемые и неэкспортируемые поля
Если имя поля начинается с заглавной буквы, оно экспортируется и доступно из других пакетов. Если с маленькой — поле является приватным для текущего пакета. Рассмотрим пример:
package 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 не экспортируется
}
Результат выполнения кода:
"Username: john_doe"
В этом примере поле Username экспортируется и доступно для чтения, а поле password недоступно за пределами пакета.
Нулевые значения полей
Если поле не инициализировано явно, оно получает нулевое значение для своего типа. Например, для строк это пустая строка, для чисел — 0. Рассмотрим пример:
package 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)
}
Результат выполнения кода:
"Name: "", Price: 0.00, InStock: false"
Как видно из примера, все поля получили нулевые значения: пустая строка, 0 и false.
Сравнение структур с полями
Структуры можно сравнивать, если все их поля сравнимы между собой. Рассмотрим пример:
package 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)
}
Результат выполнения кода:
"p1 == p2: true"
"p1 == p3: false"
Структуры p1 и p2 равны, так как все их поля совпадают. p3 отличается, поэтому сравнение дает false.
Смотрите также
-
обзорную статью
Структуры в Go,
которая знакомит с основами работы со структурами -
статью
Экспортируемые поля,
в которой подробно рассматривается видимость полей -
статью
Доступ к полям,
которая описывает различные способы обращения к полям -
статью
Теги полей структуры,
которая объясняет, как добавлять метаданные к полям