Skip to content
This repository has been archived by the owner on Apr 7, 2023. It is now read-only.

Lecture 03-04-05 improvements #21

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 11 additions & 11 deletions 03-data_structures.slide
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ http://fmi.golang.bg/

* Въпрос за мъфин #1

Какво ще покаже следния код?
Какво ще покаже следният код?

func 4times4() (res int) {
defer func() {
Expand Down Expand Up @@ -138,7 +138,7 @@ _(Заради_range_нямаме_нужда_от_foreach)_

- Не могат да растат
- Или да се свиват
- Спомняте ли указателя към масив? А ако искаме да подадем масив с друга дължина?
- Спомняте ли си за указателя към масив? А ако искаме да подадем масив с друга дължина?
- Какво е това!? Живеем в 2018, не може ли да се направи нещо?


Expand Down Expand Up @@ -184,7 +184,7 @@ _(Заради_range_нямаме_нужда_от_foreach)_
- Но всъщност един slice е (малка) структура, която е построена "върху" array
- Всички операции с тях са евтини
- Всяко оразмеряване прави _нов_ евтин слайс
- ... който "сочи" към сищия масив в паметта
- ... който "сочи" към същия масив в паметта


* Структура
Expand All @@ -211,7 +211,7 @@ _(Заради_range_нямаме_нужда_от_foreach)_

* Нулева стойност

- Както всичко в Go си имат нулева стойност и това е nil
- Както всичко в Go, slice-овете си имат нулева стойност и тя е nil

var foo []uint32
foo == nil // True
Expand Down Expand Up @@ -362,21 +362,21 @@ Built-in функция, която добавя елементи към кра

* Ключове

- Трябва да а от "сравняем" тип
- Трябва да са от "сравняем" тип

* Сравняване?

.link https://golang.org/ref/spec#Comparison_operators
- Накратко (и непълно): bool, numeric, string, channel, interface са сравними
- Масиви са сравними ако стойностите им са сравними и са равни когато всичките им стойности са равни
- Указатели са сравними и са равни когато сочат към една и съща променлива
- Масиви са сравними, ако стойностите им са сравними, и са равни, когато всичките им стойности са равни
- Указатели са сравними и са равни, когато сочат към една и съща променлива
- Структури са сравними, когато всичките им полета са сравними
- Има несравними неща, има и такива, които ще доведат до runtime panic ако ги сравнявате
- Има несравними неща, има и такива, които ще доведат до runtime panic, ако ги сравнявате
- Прочетете поне веднъж спецификацията, където всичко е изброено пълно - кратка е

* Конкурентен достъп

- За конкурентност ще говорим по - нататък, но за сега запомнете следните неща
- За конкурентност ще говорим по - нататък, но засега запомнете следните неща
- Ако се чете и пише едновременно в array, slice или map, поведенито е недефинирано
- a.k.a. не са thread-safe
- Често се случва паника
Expand Down Expand Up @@ -408,7 +408,7 @@ Built-in функция, която добавя елементи към кра
* new()

- Алокира памет, която да използваме за дадения тип
- Връща указател към нулирана, но не инициализирана памет
- Връща указател към нулирана, но неинициализирана памет

chochko := new(Person)
chochko.name = "Чочко"
Expand All @@ -424,6 +424,6 @@ new само заделя и нулира памет, а make инициализ

- Демек `make` се ползва само върху `slice` и `map`

* Следващия път
* Следващият път

- Типове и интерфейси
6 changes: 3 additions & 3 deletions 04-types_and_interfaces.slide
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ http://fmi.golang.bg/

* Въпрос за мъфин #4

Каква е разликата между `new()` и `make()`, кога се ползва едното и кога другото и какво връщат?
Каква е разликата между `new()` и `make()`, кога се ползва едното и кога другото, и какво връщат?

- `new` само заделя памет и я нулира, за разлика от `make`, което инициализира обекта
- `new` ползваме за наши типове (структури), а `make` за вградени типове като slices и maps
Expand All @@ -78,7 +78,7 @@ http://fmi.golang.bg/
type float float64
type chars string

- Не особено полезно, на пръв поглед
- Не особено полезно... на пръв поглед
- Но те могат и повече

* Нека разгледаме функцията Abs
Expand All @@ -97,7 +97,7 @@ http://fmi.golang.bg/
var number integer = -42
positiveInteger := Abs(number)

- Така се дефинира обикновена функция `Abs`, която се извиква като ѝ се подаде integer като аргумент
- Така се дефинира обикновена функция `Abs`, която се извиква, като ѝ се подаде integer като аргумент
- Това не е "обектно-ориентираният" начин да се направи подобно нещо


Expand Down
52 changes: 26 additions & 26 deletions 05-concurrency101.slide
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ http://fmi.golang.bg/
Как се създават нови типове?

- С ключовата дума `type`
- Ситанксиса е `type Name <oldType>`
- Ситанксисът е `type Name <oldType>`

* Въпрос за мъфин #3

Expand All @@ -39,7 +39,7 @@ http://fmi.golang.bg/
Какво е `c.a`?

Отговор:
- Компилатора ще ни каже грешка защото не знае кое `a` имаме предвид.
- Компилаторът ще ни каже грешка, защото не знае кое `a` имаме предвид.
- `c.A.a` е int
- `c.B.a` е float64

Expand Down Expand Up @@ -82,8 +82,8 @@ http://fmi.golang.bg/

* Конкурентност с/у Паралелизъм

- Когато говорим за конкурентност става въпрос за структурата на програмата
- Когато говорим за паралелизъм става въпрос за изпълнението ѝ
- Когато говорим за конкурентност, става въпрос за структурата на програмата
- Когато говорим за паралелизъм, става въпрос за изпълнението ѝ

* Обяснение с малко повече gophers

Expand Down Expand Up @@ -136,25 +136,25 @@ http://fmi.golang.bg/

* Предимства и недостатъци на fork

Против:
Предимства:

- Копира се паметта на процеса
- Стабилност
- Детето е независимо - ако омаже нещо, родителя няма да пострада

Недостатъци:

- Само за UNIX
- Създаването на нов процес е бавно и паметоемко
- Комуникацията между процеси е трудна - нямат обща памет
- Копира се памета на процеса

За:

- Копира се памета на процеса
- Стабилност
- Детето е независимо - ако омаже нещо, родителя няма да пострада
- Копира се паметта на процеса


* В Go се правим на модерни

- Fork не се препоръчва
- Имаме по - добър начин, за него след малко
- Ако все пак искате чрез библиотеката `syscall` можете да вдигнете нов процес
- Ако все пак искате чрез библиотеката `syscall`, можете да вдигнете нов процес
- Не го правете, ако нямате много сериозна причина


Expand Down Expand Up @@ -185,11 +185,11 @@ http://fmi.golang.bg/

* Скучно

За да се съсредоточим върху това, което се опитваме да кажем ще дадем скучен пример.
За да се съсредоточим върху това, което се опитваме да кажем, ще дадем скучен пример:

.play code/concurrency101/boring.go /^func main/,

За конкурентноста тайминга е важен. Нека е малко по - непредвидим.
За конкурентността таймингът е важен. Нека е малко по - непредвидим.


* Малко по - малко скучно
Expand All @@ -205,13 +205,13 @@ http://fmi.golang.bg/

Скучната програма не заслужава вниманието ни, нека не я чакаме.

С `go` пускаме функция нормално, но пускащия няма нужда чака приключването й.
С `go` пускаме функция нормално, но пускащият няма нужда чака приключването й.

Пускаме goroutine.

.play code/concurrency101/go-less-boring.go /^func main/,

Когато main приключи програмата спира.
Когато main приключи, програмата спира.


* Да я игнорираме малко по - малко
Expand All @@ -220,18 +220,18 @@ http://fmi.golang.bg/

Изпълнявахме main и скучната функция едновременно.

С края на main дойде и края на скучната функция.
С края на main дойде и краят на скучната функция.


* Какво е Goroutine

- Независимо изпълняваща се функция
- Практически безплатни са за създаване от към памет и процесорно време. Може да имате стотици хиляди в един процес
- Практически безплатни са за създаване откъм памет и процесорно време. Може да имате стотици хиляди в един процес
- Не е thread
- Зелени нишки
- Има умен scheduler, който мапва горутини към OS нишки
- Но ако мислите за тях като за много евтини нишки, няма да сте далеч от истината
- Дизайна на езика и особено go рутините са много повлияни от Communicating sequential processes на C. A. R. Hoare
- Дизайнът на езика и особено go рутините са много повлияни от Communicating sequential processes на C. A. R. Hoare

.link http://usingcsp.com/cspbook.pdf

Expand Down Expand Up @@ -273,7 +273,7 @@ http://fmi.golang.bg/
- Може експлицитно да използваме "ключалки", за да ограничаваме едновременния достъп до споделена памет
- В Go също може да го правим, подобно на повечето mainstream езици
- Но в много ситуации в Go би било по-добре да споделяме памет чрез комуникация
- Може да предаваме (референции към) данни между различни горутини с помощтта на канали
- Може да предаваме (референции към) данни между различни горутини с помощта на канали

* Communicate by sharing vs. Share by communicating

Expand All @@ -288,7 +288,7 @@ http://fmi.golang.bg/

* Употреба на канали

- Инстанцират се с `make`, като се подава типа, който ще се пренася
- Инстанцират се с `make`, като се подава типът, който ще се пренася
- Този е за пренасяне на цели числа:
intChannel := make(chan int)

Expand All @@ -300,10 +300,10 @@ http://fmi.golang.bg/

- В канал може да се изпраща и от него може да се получава

ch <- 64
ch <- 42
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

😉

read := <-ch

- Изпращането и получаването може да блокират докато някой "отсреща" не извърши "противоположната" операция
- Изпращането и получаването може да блокират, докато някой "отсреща" не извърши "противоположната" операция


* IO в канал
Expand Down Expand Up @@ -348,7 +348,7 @@ Simple demo:

* range

Помните ли как ви казахме, че `range` е нещо супер яко?
Помните ли, като ви казахме, че `range` е нещо супер яко?

- Може да чете и от канали
- Блокира, докато не получи следващата стойност
Expand Down Expand Up @@ -400,7 +400,7 @@ Simple demo:

.play code/concurrency101/synchronization.go /func main/,

- Не използвайте int или bool ако просто използвате канала за синхронизация.
- Не използвайте int или bool, ако просто използвате канала за синхронизация.
- Използвайте struct{} за целта - безплатно от гледна точка на памет.

* По-сложен пример
Expand Down