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()
инкапсуляция - скрытие данных однойчасти программы от кода другой