golang book 9

карты var myMap map[string]float64 = make(map[string]float64) var myMap map[string]float64{} создание карты myMap = make(map[string]int) myMap["bro"] = 5 fmt.Println(myMap["bro"]) литералы var myMap map[string]float64{ "a":4.5, "b":5.6 } при обращении к несуществующему ключу, будет выведен нулевой ответ, или пустая строка если обьявить карту, но не запихнуть туда значения, то сама переменная карты будет nil от карты можно получить 2 значения value, ok := myMap["a"] где ok будлево и означает была ли заполнена ячейка по ключу если проверить, есть ли ключ, то _, ok := myMap["a"] package main import ( "fmt" ) func main() { list := []string{ "kot", "kot", "sova", "kot", "stol", "sova", "kot", "kot", } myMap := map[string]int{} for _, name := range list { item, ok := myMap[name] if ok { item++ } else { item = 1 } myMap[name] = item } fmt.Printf("%#v\n", myMap) } Если надо удалить ключ и значение delete(myMap, "a") перебор карты for key, value := range myMap {} если только ключи, то for key := range myMap {} но порядок их доставания разный.. сортировка import "sort" names := []string{"b", "c","a"} sort.Strings(names) sort.Ints() Структуры var myStruct := struct { v1 string v2 int } При создании, полям присваивается нулевое значение myStruct.v2 = 5 создаем свой тип type myType struct { } обычно пишется после импорта var v3 myType если вы придумали тип, то нельзя назвать так переменную При изменении структуры через ссылку, необходимо обращаться к самой структуре package main import "fmt" type user struct { name string age int } func addAge(user0 *user) { user0.age++ } func main() { var user1 user user1.name = "ytatav" user1.age = 19 addAge(&user1) fmt.Printf("%#v\n", user1) } // main.user{name:"ytatav", age:20} чтоб обратиться к полю структуры по указатклю var value myStruct value.myFiled = 3 var pointer *myStruct = &value fmt.Println((*pointer).myFiled) можно заменить fmt.Println(pointer.myFiled) при передаче указателей на структуры сильно экономит память структуры лучше хранить в src в headfirstgo Для подключения пакета, где хранится тип package magaz type Product struct { Name string Price int } package main import ( "magaz" ) func main() { var s magaz.Product } Короткие записи структур Литераллы tovar := Product{Name:"aaa", Price:456} Если не заполните поле, то там будет нулевой элкмент текущего типа в структуре модет быть другая структура type Product struct { Name string Price int marka1 marka } product.marka1.name когда структура внутри структуры, то можно забить на ее имя type Product struct { Name string Price int marka } тогда обращаться станет проще product.marka.name1 если это встроенно, то можно сразу product.name1 без марки можно определить тип, который не отличается от стандартного type Liters float64 type Gallons float64 var carF Gallons = Gallons(10.0) преобразовать carF = Gallons(Litters(40.0) * 0.264) просто один тип вставляем в другой создать метод новый func (m MyType) sayHi() { fmt.Println("Hi ", m) } value := MyType("world") value.sayHi() методы можно определять только там, где определен тип Litters(2).toGallons() package main import "fmt" type Num int func (n *Num) Double() { *n *= 2 } func main() { n1 := Num(4) fmt.Println("orig ", n1) n1.Double() fmt.Println("new ", n1) } func (l Liters) ToGallons() Gallons { return Gallons(l * 0.264) } func (g Gallons) ToLiters() Liters { return Liters(g * 3.785) } func (g Gallons) ToMilliliters() Milliliters { return Milliliters(g * 3785.41) } package main import ( "fmt" ) type Date struct { Year int Month int Day int } func (d *Date) SetYear(year int) { d.Year = year } func main() { date := Date{} date.SetYear(2023) fmt.Println(date.Year) } ошибки при присваивании подключаем errors а в самих функциях if year < 1 { return errors.New("inval year") } d.Year = year return nil а с наружи принимать так же if err != nil { log.Fatal(err) } Чтоб не давать прямой доступ переменным структур то выносим их в отдельный пакет, начало их делаем с маленькой буквы функции для записи и доставания делаем с большой буквы для сохранения date.SetDay(5) для получения date.Day() инкапсуляция - скрытие данных однойчасти программы от кода другой