1
0
mirror of https://github.com/MADTeacher/go_basics.git synced 2025-11-23 21:34:47 +02:00
Files
go_basics/part_4/4.9/1.go
2025-06-04 19:37:39 +03:00

123 lines
2.7 KiB
Go

package main
import (
"errors"
"fmt"
)
type User struct {
ID uint
Name string
Age uint8
}
type UserDB struct {
users []User
}
func (db *UserDB) FindUserWithID(id uint) (*User, error) {
for _, it := range db.users {
if it.ID == id {
return &it, nil
}
}
return nil, fmt.Errorf("User with id=%v not found", id)
}
func (db *UserDB) SetUserAge(id uint, age uint8) error {
for _, it := range db.users {
if it.ID == id {
it.Age = age
return nil
}
}
return fmt.Errorf("User with id=%v not found", id)
}
func (db *UserDB) AddUser(user User) error {
for _, it := range db.users {
if it.ID == user.ID {
return fmt.Errorf("User with id=%v already exist", user.ID)
}
}
db.users = append(db.users, user)
return nil
}
func (db *UserDB) DeleteUserWithName(name string) error {
index := -1
for idx, it := range db.users {
if it.Name == name {
index = idx
break
}
}
if index < 0 {
return fmt.Errorf("User %s not found", name)
}
db.users = append(db.users[:index], db.users[index+1:]...)
return nil
}
// функции для работы с БД и организации цепочек ошибок
func findUserWithID(db *UserDB, id uint) (*User, error) {
user, err := db.FindUserWithID(id)
if err != nil {
// вернется ошибка из 2-х вложений
return nil, fmt.Errorf("DataBase error: %w", err)
}
return user, nil
}
func setUserAge(db *UserDB, id uint, age uint8) error {
err := db.SetUserAge(id, age)
if err != nil {
// вернется ошибка из 2-х вложений
return fmt.Errorf("DataBase user data error: %w", err)
}
return nil
}
func addUser(db *UserDB, user User) error {
err := db.AddUser(user)
if err != nil {
// вернется ошибка из 2-х вложений
return fmt.Errorf("Add user error: %w", err)
}
return nil
}
func main() {
dbUsers := UserDB{
[]User{
{2, "Alex", 28},
{1, "Max", 23},
{10, "German", 35},
{6, "Oleg", 19},
},
}
user, err := findUserWithID(&dbUsers, 2)
if err != nil {
fmt.Println(err)
// распаковка трассировки ошибок
fmt.Println(errors.Unwrap(err))
}
fmt.Printf("%+v\n", user) // &{ID:2 Name:Alex Age:28}
user, err = findUserWithID(&dbUsers, 12)
if err != nil {
fmt.Println(err) // DataBase error: User with id=12 not found
// распаковка трассировки ошибок
fmt.Println(errors.Unwrap(err)) // User with id=12 not found
}
fmt.Printf("%+v\n", user) // <nil>
newErr := addUser(&dbUsers, User{6, "Li", 45})
if newErr != nil {
fmt.Println(newErr) // Add user error: User with id=6 already exist
// распаковка трассировки ошибок
fmt.Println(errors.Unwrap(newErr)) // User with id=6 already exist
}
}