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.
Moim największym problemem podczas nauki języka nie był sam język ale to w jaki
sposób tworzyć w nim aplikacje sektorowe bądź aplikacje ogólne.
Dlatego że ja się wywodzą z języków obiektywnych więc jeśli np.
miałem coś takiego jak np.
do zbudowania API klient otworzyłem sobie klasy Ib i klient ona
przyjmowała w konstruktora jakieś parametry a następnie miała zestaw metod
które służyły do tego żeby taka API klienta napisać
w Google niestety nie ma czegoś takiego jak klasy więc trzeba było napisać
coś innego i budować te programy w inny sposób.
I ja zacząłem od czegoś takiego żeby stworzyć sobie takie API klienta jako
struktura i bardzo fajną rzeczą jest to że możemy jednak dodawać te filmy.
Więc to że tutaj mamy to host i mamy port i powiedzmy że stworzenie takiego API
klienta następnie jest bardzo proste tworzymy API klient
i tu podajemy nasz host to niech to będzie Local host a tutaj podajemy port i niech
to będzie 80 80 dać przecinek na końcu i mamy stworzonego API klienta
i moim następnym naturalnym krokiem było dopisanie metod.
Czyli chcemy stworzyć sobie funkcję która będzie do tego API klienta więc
wpisujemy to do klasy API klient i niech to będzie np.
Józek i zakładając że ona zwraca jakieś tak.
Tu mamy tę funkcję ona nam zwraca ten streaming i funkcji main.
Oczywiście możemy w prosty sposób wywołać metodę GET Józek
ale zauważ że minusem tego rozwiązania jest to że nie możemy tutaj dopisać słówka
Private które oznaczałoby tyle że ten host port nie jest dostępny poza po
stworzeniu tego klienta tylko mamy do niego dostęp.
Co więcej możemy go zmienić w każdej chwili.
Nie ma opcji żeby ustawić tę wartość jako stała.
I jeśli jesteś programistą to dobrze wiesz że to jest dosyć problematyczne dlatego że
jeśli piszemy z którego mogą korzystać inni programiści to chcemy go jak
najbardziej zamknąć i dać dostęp tylko do tego do czego inny programista może mieć
dostęp żeby w przyszłości za rok za dwa wrócić do tego kodu i nie bać się że jeśli
zmienimy jakiekolwiek funkcjonalność tego np.
API klienta to czy nie zapisujemy całej aplikacji więc następnym naturalnym
krokiem byłoby stworzenie z naszego interfejsu który byłby klientem.
Czyli tworzymy sobie interfejs API klient a struktura by tylko IM prezentowała ten
API klient i chcemy mieć tutaj funkcję Get i users która zwraca nam tego string.
No dobrze i w tym momencie już nie możemy
stworzyć tego API klienta tylko musimy stworzyć strukturę klient
i na niej możemy wywołać tę metodę oczywiście tutaj Google podpowiada że API
znów jest tak dlatego że ta metoda dotyczy
interfejsu a ma dotyczyć tego który tak jest wszystko OK.
No dobrze więc tak mamy stworzonego naszą strukturę.
Załóżmy że piszemy jako
interfejs API klient pozbywa się wtedy jabłka
i teraz jeśli sobie piszemy klient kropka miały dostęp tylko do metody GET YOU.
I to jest bardzo fajne i fajnie to działa
ale nie chcemy udostępniać tej struktury API klient poza paczką więc
tworzymy sobie nowy folder w którym to będzie nasz klient.
I w tym kliencie tworzymy sobie nowy plik który to będzie nasze API.
Oczywiście tworzymy nadajemy paczkę i stworzyłem ten plik z
katalogu przenosimy to do klient i nadajemy to pakiet klient.
Jeśli przekonujemy naszego API klienta do pliku API
to w tym momencie nie mamy możliwości z poziomu funkcji stworzyć naszego klienta
dlatego że musimy na początku importować naszą paczkę z importu.
I tu będzie nazwa naszego modułu ukośnie.
Klient to będzie klient kropka API klient ale
tego nie możemy stworzyć dlatego że API klient jest z małej litery.
Wiem że to dziwnie może wyglądać dla osób które mówią w innych językach
ale niestety tak to wygląda że z małej litery nie jest coś dostępne poza paczką.
Więc teraz żeby stworzyć naszego API klienta jako strukturę to musimy
stworzyć funkcję którą nazwiemy i klient i ta funkcja zwraca już stworzoną.
Stworzony interfejs IP klient.
I tutaj po prostu tworzymy naszą strukturę i musimy je przekazać tutaj host i port a
więc parametry wpisujemy host przecinek port inteligent.
I w ten sposób możemy
stworzyć naszą strukturę nie udostępniając jej na zewnątrz co jest dosyć.
Ma kilka zalet taki na przykład że nie wiemy tak naprawdę czym jest nasz
interfejs czyli tworzymy sobie przekazujemy ponad 80 80.
Niech to będzie ten lokal host.
Dzięki temu mamy dostęp do naszego IP klienta.
Tak naprawdę nie wiedząc jakie pola są w środku i nie możemy niczego zmienić.
To jest niestety wada.
Moim zdaniem że w strukturach nie możemy
mieć stałych więc żeby to obejść tworzymy interfejs wracamy.
Jakie dodatkowe ma to zalety.
Ano takie że jeśli chcemy napisać testy to
możemy odmienić naszą strukturę zamiast i użyć zamiast tego jakiejś
nowej struktury tam struktura może nam posłużyć do tego żeby i uzyskać przykład
zwracało specjalnie przez nas zdefiniowany Host i np.
użytkowników
a nie dokładnie tych z internetu więc blokowanie to jest bardzo proste w
przypadku takiej jak te i ja sobie dzielę najczęściej właśnie w
ten sposób i tam również polecam to robić bo wydzielanie ich później do innych
miejsc lub zmiana sposobu działania jest bardzo prosta.
I to by było na tyle w tej lekcji zapraszam Cię do kolejki.