package main

import (
	"fmt"
)

type Person struct {
	Id   int
	Name string
}

// не изменяет оригинальной структуры, для которой вызван
func (p Person) UpdateName(name string) {
	p.Name = name
}

// изменяет оригинальную структуру
func (p *Person) SetName(name string) {
	p.Name = name
}

type Account struct {
	Id   int
	Name string
	Person
}

type MySlice []int

func (sl *MySlice) Add(val int) {
	*sl = append(*sl, val)
}

func (sl *MySlice) Count() int {
	return len(*sl)
}

func main() {
	/*
		pers := Person{1, "Vasily"}
		fmt.Println(pers.Name)
		pers.SetName("Vasily Romanov")
		fmt.Println(pers.Name)
	*/
	var acc Account = Account{
		Id:   1,
		Name: "rvasily",
		Person: Person{
			Id:   2,
			Name: "Vasily Romanov",
		},
	}

	acc.SetName("romanov.vasily")
	fmt.Println(acc.Name)
	fmt.Println(acc.Person.Name)

	sl := MySlice([]int{1, 2})
	sl.Add(3)
	fmt.Println(sl.Count(), sl)
}
