- Объявление среза структур
- Добавление новых элементов
- Изменение значений внутри среза
- Срез указателей на структуры
- Поиск и фильтрация
В Go часто возникает необходимость хранить набор однотипных структур. Для этого удобно использовать срезы структур. Такой подход позволяет работать с коллекцией объектов, каждый из которых имеет одинаковый набор полей.
Объявление среза структур
Срез структур можно объявить так же, как и срез базовых типов:
type User struct {
Name string
Email string
}
func main() {
users := []User{
{Name: "Семен", Email: "semen@example.com"},
{Name: "Юля", Email: "yulia@example.com"},
}
for _, u := range users {
fmt.Println(u.Name, u.Email)
}
}
Добавление новых элементов
Элементы добавляются с помощью append
:
users = append(users, User{Name: "Алексей", Email: "alex@example.com"})
Изменение значений внутри среза
Так как срез хранит копии структур, при изменении элемента важно помнить о передаче по значению. Например:
users[0].Name = "Семен Иванов"
Изменение произойдет напрямую, так как мы работаем с элементом по индексу.
Срез указателей на структуры
Если нам нужно хранить и изменять объекты по ссылке, можно использовать срез указателей:
type User struct {
Name string
Email string
}
func main() {
users := []*User{
{Name: "Семен", Email: "semen@example.com"},
{Name: "Юля", Email: "yulia@example.com"},
}
users[0].Name = "Семен Иванов" // Изменение отразится на оригинальном объекте
}
Использование указателей полезно, если структуры большие и их копирование неэффективно.
Поиск и фильтрация
Для поиска элементов в срезе структур можно использовать обычные циклы:
func FindUserByEmail(users []User, email string) *User {
for i := range users {
if users[i].Email == email {
return &users[i]
}
}
return nil
}