od Podstaw
6 godz. 26 min · Go · Full-stack i Programowanie
Piotr KrzesajW Go wszystko opiera się o typy. Czym one są? Tak zwane typy proste(string, int, float itd.) to tylko początek, interfejsy, struktury i nie tylko. Pokażę Ci jak używać wielu wątków Go i jakie są sposoby komunikacji między nimi, a także opowiem i pokażę na praktycznych przykładach jakie zagrożenia niesie ze sobą wykorzystywanie wielowątkowości.
W Go nie mamy obiektowości znanej z wielu innych języków. Posiada zalążki obiektowości ale sprawia to wielu osobom problemy jak podejść do architektury aplikacji. Nauczę Cię jak podejść do funkcyjności w taki sposób aby wciąż nawet duże aplikacje były łatwo rozwijalne lub co ważniejsze, była możliwość podzielenia ich na mniejsze mikroserwisy gdy zajdzie taka potrzeba.
Wśród programistów można usłyszeć głosy że w Go wielowątkowość jest świetnie rozwiązana i trudno się z tym nie zgodzić ale warto pamiętać że nasze mózgi działają jednowątkowo i często pomijamy zagadnienia takie jak wyścig wątków, deadlock i inne wyzwania, które stawia przed nami praca na dzisiejszych procesorach. Pokażę i wytłumaczę Ci w praktyce większość z nich i jak sobie z nimi radzić i na co uważać. Jeśli nie pracowałeś z językami wielowątkowymi to ta sekcja jest specjalnie dla Ciebie.
Zastanawiałem się wiele razy czy nie istnieje taka technologia w której piszę sobie jeden pliczek i z tego pliku do każdego języka mogę wygenerować sobie klienta i serwer jedną komendą. To jest w wielkim skrócie GRPC, nie musisz się przejmować czy używasz HTTP 1.1/2.0, czy używasz websocketów do transmisji, czy przesyłasz dane w formacie JSON, XML, Protobuf, czy jest moje API kompatybilne wstecz. Tym wszystkim zajmuje się GRPC. Wyjaśnię Ci czym dokładnie jest, dlaczego jest super i wreszcie jak tego używać razem z językiem Go. Napiszemy praktyczny projekt chatu w którym wykorzystamy funkcję server-streaming.
Pisząc aplikację chcemy aby uruchamiała się ona tak samo niezależnie czy uruchamiamy ją na Linuxie, macOS czy na Windowsie i z pomocą przychodzi nam Docker. Pokażę Ci jak z gotowej aplikacji napisanej w Go stworzyć obraz Dockerowy aby móc go uruchamiać na swoim komputerze bądź serwerze. Pokażę Ci również jak nasz obraz Dockerowy połączyć z bazą danych za pomocą Docker Compose aby móc cieszyć się działającą aplikacją uruchamianą jedną komendą.
Kurs Go nie mógłby obejść się bez serwera HTTP stworzonego tylko z pomocą biblioteki wbudowanej w język Go. Dokładnie tak, nie musisz instalować nic poza językiem i już możesz tworzyć serwery co jest świetną wiadomością. Następnie pokażę Ci popularną bibliotekę Gin do tworzenia serwerów. Dzięki temu zobaczysz różnice i ocenisz czy warto zostać przy wbudowanej bibliotece czy może używać zewnętrznych.
Jak w każdym języku serwerowym tak i w Go możemy się podłączyć pod bazę danych. Krok po kroku wyjaśnię Ci jak to zrobić prosto i przyjemnie używać baz SQL, które od dziesiątek lat cieszą się niezwykłą popularnością. Migracje, zapytania czy dbanie o połączenie to nie będzie dla Ciebie nic trudnego.
Ten Kurs powstał z myślą o osobach, które chciałyby poszerzyć swoją wiedzę o język Go. Zakłada on że posiadasz już wiedzę z minimum jednego innego języka programowania i wiesz w jaki sposób działa komunikacja po protokole HTTP. Możesz też znać Go i chcieć zobaczyć jak dzielić programy na paczki tak aby były łatwo rozwijalne w przyszłości.
Poprzedniej lekcji nauczyliśmy się jak zainstalować nasz generator
serwisów w tej lekcji nauczymy się jak napisać taki prosty serwis który możemy
potem użyć i wygenerować z tego klienta dla np.
aplikacja rasowej bądź rajdowej lub np.
dla Webba czyli to będzie Web.
Teraz musimy stworzyć nasz plik prototyp to będzie taki schemat.
Zanim jednak do tego przejdziemy polecam
czyli zainstalować rozszerzenie za pomocą Visual Studio KOD i to będzie to 3.
I to jest to 3.
I to będzie Scout 3.
Polecam zainstalować rozszerzenie tak aby łatwiej pisać takie schematy w pliku
protokole a tym czasem przejdźmy do napisania tych plików.
Czyli tak w głównym katalogu
naszego projektu tworzymy sobie katalog o nazwie proton.
Następnie będzie to Józek jest więc otwieramy i tworzymy katalog Józek a
następnie tworzymy w tym katalogu Józek plik serwis to
i tak jest na początku musimy powiedzieć czego używamy czyli używamy
zgodnego z prototypu a następnie musimy nadać nazwę naszej paczce jest to serwis.
Nazywamy go serwisem.
A następnie musimy stworzyć już
nasz serwis po prostu wpisując słówko kluczowe i Visual Studio co nam nie
podpowiada składni dlatego że tutaj pakiet musi być bez znaku poufności.
Serwis czyli nazwa paczki również nie powinno być w cudzysłowie.
Jeśli chcemy stworzyć używamy słów kluczowych
następnie nazywamy ten segment czyli to będzie nasz Józek serwis.
I od tego momentu będzie nasze metody
w naszym serwisie więc tak żeby stworzyć pierwszą metodę.
Wystarczy wpisać słówko kluczowe.
I tutaj Visual Studio odpowiedział Musimy
tutaj napisać jaka to jest metoda czyli jej język.
Następnie request to stwórzmy sobie Create Józek request.
I to będzie nasz film który będzie stringi podać typ 1.
Następnie będzie to last String i 2
tu po znaku równości musimy podać numer elementów który będzie przesyłany przez
to musi być od jednego do następnych jeśli usuwamy jakiś element
to żeby było kompatybilne wstecz ta dwójka już jest zarezerwowana.
Czyli wtedy musimy np.
wpisać Last nam trwa i to będzie już nie
dwa jak to usunięte tylko to już musi być 3.
Czyli musimy pamiętać że to nie może.
Czyli to już będzie wtedy puste jakby ten identyfikator musi być unikalny w
kontekście tego serwisu jeśli wprowadzamy nawet jakieś zmiany.
No dobrze mamy ten teraz jest e-mail i hasło.
Jako odpowiedź
chcemy zwrócić nic czyli to będzie jej język i sposób to będzie puste.
Więc tutaj wpisujemy Józek i z gwiazd
a jako zwrotka z tej metody to będzie Józek i mamy naszą pierwszą metodę pisali.
Właściwie to używają PiS naszego serwisu
i jak mamy już napisane że jest pierwszą metodę to ja tutaj leje.
To co przygotowałem wcześniej już tłumaczy dlaczego.
To nie jest tak że nie potrafię tego napisać tylko po prostu
przygotowałem aplikację mobilną która korzysta z dokładnie tego schematu jeśli
zmienimy jakkolwiek ten schemat to aplikacja niestety nie będzie działała.
Więc to jest ważne żeby aplikacja jeśli
aktualizuje pliki to to żeby aplikacja też czy aplikacja mobilna czy aplikacja
czy inny mikrofon będzie tych plików to korzystał aby też to zaktualizowana.
Więc tak tutaj oczywiście jest ten tekst
to trzy czy serwis tutaj importuje my coś z emocji to tutaj nazywamy to jak się ma
nazywać to w slangu czyli my to chcemy żeby to było kurs jeden po kilku pakietach
po adapter i żeby to znalazło się w katalogu.
I tu mamy trzy metody CREATE USER login i user I get user info.
I tutaj mamy.
I właśnie tutaj mamy zmienioną kolejność
niż to co stworzyliśmy i to jest bardzo ważne bo aplikacja po prostu wtedy by
to co byłoby i mailem przyjął imię i hasło np.
jako nazwisko więc proszę sobie te pliki jeśli chcesz oczywiście
korzystać z aplikacji mobilnej jeśli nie możesz stworzyć swoje własne.
Ten import na razie nie jest nam potrzebny więc go usuwamy
mając pliki to musimy teraz przejść do generowania naszego serwera na podstawie
tych plików i aby to zrobić to musimy użyć pewnej komendy ja ją przygotowałem
wcześniej i już ją wklej to ona będzie oczywiście dostępna w
materiałach do reakcji i to co trzeba tutaj wykonać to wykonać
prototyp pauza pauza go od użycia po znaku równości flagi i po znaku
równości dwóch kropek Flash czyli tu będziemy w naszym katalogu będziemy
generować nasze pliki już wygenerowany klient.
I skąd bierzemy nasze pliki czyli nasze pliki to będziemy brać z
katalogu kursy jeden z katalogu to związek i serwis.
Teraz zwróć uwagę że ja tutaj
wywołuje to na katalogu kurs 1 czyli oznacza to że ta metoda
musi zostać wywołana z katalogu wyżej czyli w tym momencie ja usuwamy to co
kupiłem przechodzę do katalogu wyżej i dokładnie tę samą metodę.
Wywołuje tę metodę i zobaczyłem że Arnold
i to powinno być juz go tego jak pisał Generał.
Tak więc musimy tutaj zmienić to pauza pauza go a na pauza pauza go out.
Więc Antek i tutaj znowu mamy problem taki że nosa czy flag nie mamy tutaj loginów.
Więc zrobimy to i zobaczymy czy to zadziała.
No i tutaj znowu mamy problem dlatego że nie mamy flagi poza
i musimy tutaj wrócić do dokumentacji oficjalnej i zobaczyć w jaki sposób jest
to generowane to i tutaj widzimy że to jest pauza pauza od kropka.
Tak więc napiszemy swoją własną komendę bo
jak taką przygotowałem niestety nie działa tak.
Najtrudniejsze w
obsłudze jest to żeby wygenerować klienta jeśli już wygeneruje klienta to jest o
wiele prostsze więc korzystamy z tego co mówi
dokumentacja czyli jest ok a to oznacza że będziemy w tym miejscu
generować klienta więc chcemy go wygenerować w katalogu kurs 1.
Następnie chcemy żeby to było oprawcy PAP to jest coś co możemy importować
dlatego że w plikach możemy importować inne pliki
to więc to służy do tego żeby ustawić skąd ma ewentualnie brać kolejny import.
Dlatego nas to prawdopodobnie nie interesuje i możemy przejść do o zapasach
go pauza out czyli to gdzie będą pliki umieszczone więc będzie pauza poza grą
ale i my chcemy żeby on zaczął od naszego katalogu z projektem.
A następnie mamy.
To jest dokładnie to samo co w tym przypadku.
I tutaj musimy pokazać gdzie są nasze
pliki to więc sobie je realizujemy i to będzie nasz serwis i po naciśnięciu
klawisza enter zobaczymy że zostaną Wygenerowany plik
w naszym konkursie który jest adaptacją i zaraz mamy tutaj dwa pliki jak PCM.
Musimy niestety je ręcznie przenieść do naszego katalogu adapter na razie
a następnie stworzyć tutaj katalog i przenieść to do tego katalogu.
Zauważ proszę że mimo tego że miałem przygotowaną komendę to niestety miałem
problem z tym żeby wygenerować tego klienta.
Więc jeśli tobie się nie uda to zrobić to po prostu Kopiuj.
Wygenerowany plik z katalogu tak aby nie tracić czasu
niepotrzebnie na próby naprawienia tego dlatego że jak wspomniałem najtrudniejsze
jest to żeby wygenerować tego klienta użycie go jest bardzo prosta sprawa.
Co ci zaraz pokażę.
Tak niestety pliki jak pisanie nie komplikują się dlatego że nie posiadamy
tych paczek czyli nie posiadamy ich status więc wróćmy do dokumentacji.
Dokumentacja
może się z czasem zmienić dlatego że jest stosunkowo nowym standardem tak więc
musimy importować prawdopodobnie jakieś biblioteki które tutaj nie ma i w
tej dokumentacji również ich tutaj nie ma i po chwili szukania okazało się że
wystarczy tak naprawdę skopiować to i wpisać.
Tak zrobiłem to chwilkę wyżej i wszystko nagle zaczęło działać i kombinować.
Także mamy wygenerowane dwa pliki jak
zobaczymy tutaj to mamy też jak interfejs i mamy tutaj user serwis klient.
Jeśli zatem prezentujemy ten interfejs to tutaj zobaczymy że mamy
Request mamy tutaj jakieś kalosze sprzęt i mamy tutaj zwrot jako normalna
zwierzątka z funkcji mamy Clear Request Live Response przepraszam.
Tak więc stwórzmy nasz serwer czyli stwórzmy aplikację Gazeta.pl.
I go do pakietu jak pisali.
To nam się chyba coś się dzieje i nikt nie chce się nam skompletować.
Tu jest jakiś problem że nie możemy importować tego więc zróbmy sobie gałkę
i zastanowimy tę paczkę i już jest wszystko OK.
Mając nasz serwer.
Najpierw chcielibyśmy zaimplementowane
dokładnie te same metody które mieliśmy tutaj czyli chcielibyśmy mieć te trzy
funkcje czyli login i Get info tak więc aby to zrobić musimy mieć PC user
serwer i niech to będzie struktura i ta struktura musi zatem prezentować ten
protokół czyli musi prezentować tego języka serwis klienta więc kupujmy
wszystko co wymaga ten interfejs i wklej my sobie tutaj stwórzmy sobie
funkcję która będzie przypisana do naszego user serwer.
I zróbmy dokładnie to samo dla wszystkich
pozostałych metod im prezentując w ten sam sposób jak w
przypadku serwera HTTP gdzie ten interfejs sami sobie napisaliśmy to tutaj ten klient
generuje Go za nas jak widzimy nie mamy ani kontekstu który musimy importować
czyli kontekst i a importuje też te rzeczy za importowane musimy
zwrócić dwa razy LOL LOL i LoL mamy zaimplementowane te metody.
Okazuje się że ta funkcja nie jest używana jest określona.
Co się za chwilę zmieni więc tak żeby nasz
serwis działał musimy oczywiście przekazać mu Józek serwis dokładnie w taki sam
sposób jak robiliśmy to w przypadku user to będzie taki Józek Józek serwis.
Tak i mając to możemy również stworzyć Clifford duży jak Silver
i wracamy tutaj user serwis klient czyli wracamy na nasz Józek serwer.
I jako wymaganie jest nasz serwis czyli Józek Józek z serwisu ale Józek serwis
przekażemy w takim razie Józek serwis jako nasz serwis możemy zmienić nazwę Związek
po prostu serwis bo to jest oczywiste że chodzi o
I to jest pierwszy etap czyli tak naprawdę zaimplementowane naszego interfejsu tak
żeby nasz klient był ten nie był spełniony.
Następną rzeczą jaką jest to musimy zacząć
nas wsłuchiwać na porcie czyli w tym momencie
uruchomiliśmy nasz serwer Jim na pokrycie 80 80 teraz ważną rzeczą jest to że po
uruchomieniu tego serwera główny wątek jest blokowany.
Dlaczego on jest blokowany dlatego że zasługuje na porcie.
Cały czas dopóki nie zabijamy aplikacji więc żeby uruchomić serwer np.
http idzie jak psy.
No to musimy.
Musimy uruchomić go na osobnym wątku żeby to zrobić wystarczy że tak naprawdę
Weźmiemy wszystko to co tutaj mamy wyciągniemy do osobnej funkcji czy np.
http i wklej to z powrotem i teraz Zauważ że
nie mamy dostępnych tych metod dlatego że tutaj trzeba przekazać czyli Józek serwer.
Jeśli przekażemy ten serwer to wystarczy
że wymienimy serwer tak i musimy jeszcze przekazać serwer jako
Jim czyli musimy zmienić Józek żeby te rzeczy się nie złe.
I przypisuje mu błąd bo tworzymy go na nowo.
No dobrze czyli mamy w tym momencie już wystartowały HTTPS Techmex
jeszcze uruchomi go uruchomimy go na osobnym wątku.
To niestety ale nasza aplikacja się
zamknie dlatego że żaden wątek nie będzie blokowany więc wyjdziemy z tej funkcji
na tę chwilę nie chcemy żeby było to uruchamiane na osobnym wątku a teraz
uruchomimy serwer na innym tak żeby z HTTPS mogły działać jednocześnie.