From a186f20d55e69b55531c3307c532758f3543dbbd Mon Sep 17 00:00:00 2001 From: NickyMateev Date: Sat, 10 Nov 2018 23:57:03 +0200 Subject: [PATCH 1/3] Fix lecture 05 --- 05-concurrency101.slide | 52 ++++++++++++++++++++--------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/05-concurrency101.slide b/05-concurrency101.slide index 56f8d5b..b4f064b 100644 --- a/05-concurrency101.slide +++ b/05-concurrency101.slide @@ -19,7 +19,7 @@ http://fmi.golang.bg/ Как се създават нови типове? - С ключовата дума `type` -- Ситанксиса е `type Name ` +- Ситанксисът е `type Name ` * Въпрос за мъфин #3 @@ -39,7 +39,7 @@ http://fmi.golang.bg/ Какво е `c.a`? Отговор: -- Компилатора ще ни каже грешка защото не знае кое `a` имаме предвид. +- Компилаторът ще ни каже грешка, защото не знае кое `a` имаме предвид. - `c.A.a` е int - `c.B.a` е float64 @@ -82,8 +82,8 @@ http://fmi.golang.bg/ * Конкурентност с/у Паралелизъм -- Когато говорим за конкурентност става въпрос за структурата на програмата -- Когато говорим за паралелизъм става въпрос за изпълнението ѝ +- Когато говорим за конкурентност, става въпрос за структурата на програмата +- Когато говорим за паралелизъм, става въпрос за изпълнението ѝ * Обяснение с малко повече gophers @@ -136,25 +136,25 @@ http://fmi.golang.bg/ * Предимства и недостатъци на fork -Против: +Предимства: + +- Копира се паметта на процеса +- Стабилност +- Детето е независимо - ако омаже нещо, родителя няма да пострада + +Недостатъци: - Само за UNIX - Създаването на нов процес е бавно и паметоемко - Комуникацията между процеси е трудна - нямат обща памет -- Копира се памета на процеса - -За: - -- Копира се памета на процеса -- Стабилност -- Детето е независимо - ако омаже нещо, родителя няма да пострада +- Копира се паметта на процеса * В Go се правим на модерни - Fork не се препоръчва - Имаме по - добър начин, за него след малко -- Ако все пак искате чрез библиотеката `syscall` можете да вдигнете нов процес +- Ако все пак искате чрез библиотеката `syscall`, можете да вдигнете нов процес - Не го правете, ако нямате много сериозна причина @@ -185,11 +185,11 @@ http://fmi.golang.bg/ * Скучно -За да се съсредоточим върху това, което се опитваме да кажем ще дадем скучен пример. +За да се съсредоточим върху това, което се опитваме да кажем, ще дадем скучен пример: .play code/concurrency101/boring.go /^func main/, -За конкурентноста тайминга е важен. Нека е малко по - непредвидим. +За конкурентността таймингът е важен. Нека е малко по - непредвидим. * Малко по - малко скучно @@ -205,13 +205,13 @@ http://fmi.golang.bg/ Скучната програма не заслужава вниманието ни, нека не я чакаме. -С `go` пускаме функция нормално, но пускащия няма нужда чака приключването й. +С `go` пускаме функция нормално, но пускащият няма нужда чака приключването й. Пускаме goroutine. .play code/concurrency101/go-less-boring.go /^func main/, -Когато main приключи програмата спира. +Когато main приключи, програмата спира. * Да я игнорираме малко по - малко @@ -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 @@ -273,7 +273,7 @@ http://fmi.golang.bg/ - Може експлицитно да използваме "ключалки", за да ограничаваме едновременния достъп до споделена памет - В Go също може да го правим, подобно на повечето mainstream езици - Но в много ситуации в Go би било по-добре да споделяме памет чрез комуникация -- Може да предаваме (референции към) данни между различни горутини с помощтта на канали +- Може да предаваме (референции към) данни между различни горутини с помощта на канали * Communicate by sharing vs. Share by communicating @@ -288,7 +288,7 @@ http://fmi.golang.bg/ * Употреба на канали -- Инстанцират се с `make`, като се подава типа, който ще се пренася +- Инстанцират се с `make`, като се подава типът, който ще се пренася - Този е за пренасяне на цели числа: intChannel := make(chan int) @@ -300,10 +300,10 @@ http://fmi.golang.bg/ - В канал може да се изпраща и от него може да се получава - ch <- 64 + ch <- 42 read := <-ch -- Изпращането и получаването може да блокират докато някой "отсреща" не извърши "противоположната" операция +- Изпращането и получаването може да блокират, докато някой "отсреща" не извърши "противоположната" операция * IO в канал @@ -348,7 +348,7 @@ Simple demo: * range -Помните ли как ви казахме, че `range` е нещо супер яко? +Помните ли, като ви казахме, че `range` е нещо супер яко? - Може да чете и от канали - Блокира, докато не получи следващата стойност @@ -400,7 +400,7 @@ Simple demo: .play code/concurrency101/synchronization.go /func main/, -- Не използвайте int или bool ако просто използвате канала за синхронизация. +- Не използвайте int или bool, ако просто използвате канала за синхронизация. - Използвайте struct{} за целта - безплатно от гледна точка на памет. * По-сложен пример From 804f9234df7d20534ff83e4ff3dac47915dd599e Mon Sep 17 00:00:00 2001 From: NickyMateev Date: Sun, 11 Nov 2018 00:16:44 +0200 Subject: [PATCH 2/3] Fix lecture 03 --- 03-data_structures.slide | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/03-data_structures.slide b/03-data_structures.slide index 7dff3a0..c82f8b3 100644 --- a/03-data_structures.slide +++ b/03-data_structures.slide @@ -17,7 +17,7 @@ http://fmi.golang.bg/ * Въпрос за мъфин #1 -Какво ще покаже следния код? +Какво ще покаже следният код? func 4times4() (res int) { defer func() { @@ -138,7 +138,7 @@ _(Заради_range_нямаме_нужда_от_foreach)_ - Не могат да растат - Или да се свиват -- Спомняте ли указателя към масив? А ако искаме да подадем масив с друга дължина? +- Спомняте ли си за указателя към масив? А ако искаме да подадем масив с друга дължина? - Какво е това!? Живеем в 2018, не може ли да се направи нещо? @@ -184,7 +184,7 @@ _(Заради_range_нямаме_нужда_от_foreach)_ - Но всъщност един slice е (малка) структура, която е построена "върху" array - Всички операции с тях са евтини - Всяко оразмеряване прави _нов_ евтин слайс -- ... който "сочи" към сищия масив в паметта +- ... който "сочи" към същия масив в паметта * Структура @@ -211,7 +211,7 @@ _(Заради_range_нямаме_нужда_от_foreach)_ * Нулева стойност -- Както всичко в Go си имат нулева стойност и това е nil +- Както всичко в Go, slice-овете си имат нулева стойност и тя е nil var foo []uint32 foo == nil // True @@ -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 - Често се случва паника @@ -408,7 +408,7 @@ Built-in функция, която добавя елементи към кра * new() - Алокира памет, която да използваме за дадения тип -- Връща указател към нулирана, но не инициализирана памет +- Връща указател към нулирана, но неинициализирана памет chochko := new(Person) chochko.name = "Чочко" @@ -424,6 +424,6 @@ new само заделя и нулира памет, а make инициализ - Демек `make` се ползва само върху `slice` и `map` -* Следващия път +* Следващият път - Типове и интерфейси From 9ee47697898fab641685e33c1c8b2eff10aaba65 Mon Sep 17 00:00:00 2001 From: NickyMateev Date: Sun, 11 Nov 2018 00:28:21 +0200 Subject: [PATCH 3/3] Fix lecture 04 --- 04-types_and_interfaces.slide | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/04-types_and_interfaces.slide b/04-types_and_interfaces.slide index 882ba22..9aaf853 100644 --- a/04-types_and_interfaces.slide +++ b/04-types_and_interfaces.slide @@ -52,7 +52,7 @@ http://fmi.golang.bg/ * Въпрос за мъфин #4 -Каква е разликата между `new()` и `make()`, кога се ползва едното и кога другото и какво връщат? +Каква е разликата между `new()` и `make()`, кога се ползва едното и кога другото, и какво връщат? - `new` само заделя памет и я нулира, за разлика от `make`, което инициализира обекта - `new` ползваме за наши типове (структури), а `make` за вградени типове като slices и maps @@ -78,7 +78,7 @@ http://fmi.golang.bg/ type float float64 type chars string -- Не особено полезно, на пръв поглед +- Не особено полезно... на пръв поглед - Но те могат и повече * Нека разгледаме функцията Abs @@ -97,7 +97,7 @@ http://fmi.golang.bg/ var number integer = -42 positiveInteger := Abs(number) -- Така се дефинира обикновена функция `Abs`, която се извиква като ѝ се подаде integer като аргумент +- Така се дефинира обикновена функция `Abs`, която се извиква, като ѝ се подаде integer като аргумент - Това не е "обектно-ориентираният" начин да се направи подобно нещо