Go курс для разработчиков. Урок 15 - структуры

Структуры (Structures): Структуры в Go - это коллекция полей разных типов данных. Они позволяют объединять связанные данные в одну единицу. Структуры могут содержать как поля базовых типов (int, string, bool), так и другие структуры. Пример: ```go type Person struct { Name string Age int } func main() { p := Person{Name: “John“, Age: 25} (, ) } Структуру можно инициализировать, не передавая значения. В этом случае каждое поле примет свое «нулевое» значение: func main() { p := Person{} // ““ // 0 } Регистр первой буквы в названии структуры и полей означает публичность точно так же, как в переменных и функциях. Если первая буква заглавная, то структуру можно инициализировать во внешних пакетах. В противном случае она доступна только в рамках текущего пакета: type Person struct { // структура публична Name string // поле публично wallet wallet // поле приватно: можно обращаться только внутри текущего пакета } type wallet struct { // структура приватна: можно инициализировать только внутри текущего пакета id string moneyAmount float64 } У любого поля структуры можно указать теги. Они используются для метаинформации о поле для сериализации, валидации, маппинга данных из БД и тд. Тег указывается после типа данных через бектики: type User struct { ID int64 `json:“id“ validate:“required“` Email string `json:“email“ validate:“required,email“` FirstName string `json:“first_name“ validate:“required“` } Тег json используется для названий полей при сериализации/десериализации структуры в json и обратно: package main import ( “encoding/json“ “fmt“ ) type User struct { ID int64 `json:“id“` Email string `json:“email“` FirstName string `json:“first_name“` } func main() { u := User{} = 22 = “test@“ = “John“ bs, _ := (u) (string(bs)) // {“id“:22,“email“:“test@“,“first_name“:“John“} } Тег validate используется Go-валидатором. В следующем примере присутствует вызов функции у структуры (u). Функции структур — методы — мы разберем подробно в соответствующем уроке, а пока просто посмотрите, как происходит вызов: package main import ( “fmt“ ““ ) type User struct { ID int64 `validate:“required“` Email string `validate:“required,email“` FirstName string `validate:“required“` } func main() { // создали пустую структуру, чтобы проверить валидацию u := User{} // создаем валидатор v := () // метод Struct валидирует переданную структуру и возвращает ошибку `error`, если какое-то поле некорректно ((u)) } Вывод программы: Key: ’’ Error:Field validation for ’ID’ failed on the ’required’ tag Key: ’’ Error:Field validation for ’Email’ failed on the ’required’ tag Key: ’’ Error:Field validation for ’FirstName’ failed on the ’required’ tag Задание На сервер приходит HTTP-запрос. Тело запроса парсится и мапится в модель. Сразу работать с моделью нельзя, потому что данные могут быть неверными. Реализуйте функцию Validate(req UserCreateRequest) string, которая валидирует запрос и возвращает строку с ошибкой “invalid request“, если модель невалидна. Если запрос корректный, то функция возвращает пустую строку. Правила валидации и структура модели описаны ниже. Не используйте готовые библиотеки и опишите правила самостоятельно. type UserCreateRequest struct { FirstName string // не может быть пустым; не может содержать пробелы Age int // не может быть 0 или отрицательным; не может быть больше 150 } Наличие пробелов можно проверить с помощью функции (firstName, “ “).
Back to Top