Golang - przydatne narzędzia i techniki

Nic prostszeGo? Golang - przydatne narzędzia i techniki

Michał Groele
3 minutes read

Język programowania Golang jest stosunkowo łatwy do nauczenia. Jedyne, co może przysporzyć problemów w zrozumieniu jego założeń, to pierwsze doświadczenia w programowaniu w innych językach, takich jak PHP lub Ruby.

Jednakże napisanie nawet złożonego kodu i uruchomienie go w Golangu może być o wiele prostsze niż w innych językach, gdyż w większości przypadków Go nie wymaga dodatkowych bibliotek lub narzędzi. Mimo, że na początku jest przyjemnie i łatwo, na późniejszym etapie mogą pojawić się pewne komplikacje. Istnieją jednak narzędzia i techniki, które mogą ułatwić pracę z tym językiem. Niewielką ich część postaram się tutaj przedstawić bazując na własnych doświadczeniach projektowych.

Przydatne techniki

Wykorzystanie interfejsów

Przez pewien czas, na początkowym etapie prac nad projektem, rzadko używaliśmy interfejsów – zazwyczaj jedynie do zdefiniowania repozytoriów. Pozostałe funkcje, które nie były funkcjami powiązanymi ze strukturami, były tworzone z wykorzystaniem domknięć (Closures). W pewnym momencie okazało się, że takie rozwiązanie przysparza problemów w debugowaniu kodu, dlatego od tamtego momentu wykorzystujemy interfejs do tworzenia każdej nowej funkcji. Poza niewątpliwym ułatwieniem debugowania kodu, pozwoliło nam to na łatwiejsze rozbijanie kodu na części.

Interfejsy i repozytoria

Inną przydatną techniką związaną z interfejsami jest możliwość łatwej zmiany sposobu komunikacji z bazą danych (pomijając oczywiście bardzo znaczące modyfikacje jak np. zmiana źródła danych z MySQL na CSV) jak przełączenie się między paczkami sql, sqlx a nawet GORM. 

Jeden z realizowanych przez nas w Polcode projektów jest przykładem tego, że taka zmiana wymagała jedynie napisania funkcji w samych repozytoriach oraz podmiany źródeł danych w DI (dependency injection) – pozostała część kodu została nienaruszona. Dzięki temu mogliśmy też przetestować GORM jedynie na części kodu, po czym przełączyć się w pełni z sqlx. 

Obsługa błędów

Kolejną zaletą Go jest intuicyjna obsługa błędów. Dlaczego jest ona taka prosta? Głównie dlatego, że nie musimy, tak jak w innych językach, rzucać i łapać wyjątków. Wystarczy zwrócić w jednym atrybucie rezultat funkcji, a w drugim błąd. W zależności od rezultatu – jeden lub drugi atrybut będzie pusty.

W obsłudze błędów warto pamiętać o zaciemnianiu zmiennych (tzw. shadowing). Będzie to wymagać nieco więcej wysiłku, aby każda zmienna, w której jest błąd, nie nazywała się po prostu “err”. Taki dodatkowy wysiłek może się opłacić, jeśli w pewnym momencie zdecydujemy, że chcemy zwracać więcej niż jeden błąd (co może być szczególnie przydatne na etapie testów).

Innymi przydatnymi technikami przy wykrywaniu błędów są, wprowadzone w Go 1.13, “errors.Wrap” i “errors.Is”. Pozwalają one dodać informacje do błędów z zewnętrznych paczek (na przykład informacje o miejscu wystąpienia w naszym kodzie), ale w odróżnieniu od “fmt.Sprintf” umożliwiają łatwe sprawdzenie źródłowego błędu i warunkowe obsłużenie go.

Przydatne narzędzia

IDE

Każdy, kto pracuje w Go zna produkty firmy JetBrains, wśród których znajduje się popularny GoLand. To świetne narzędzie zarówno do pracy z Go, jak i z bazą danych, Dockerem oraz mnóstwem innych funkcji. Warto rozważyć również edytory takie jak Visual Studio Code oraz Atom.

Lintery

Jeśli chcesz pisać dobrze wyglądający kod i nie poprawiać go wielokrotnie używaj linterów już od początku swojej pracy nad projektem. 

Linterem, który wykorzystuję w swojej codziennej pracy jest golangci/golangci-lint oraz rozszerzenie do GoLand, Go Linter. Linter ten powiadamia nas o najczęściej popełnianych błędach. Można go również zintegrować z Ci/CD i używać tej samej konfiguracji.

Innymi wartymi rozważenia linterami są:

  • goimports – służący do “sprzątania” importów w naszych plikach oraz 
  • gofmt – który pomaga nam sformatować kod. 

Wsparcie dla naszych komend

Pisanie kodu wywoływanego jako komendy w Go już samo w sobie jest proste, można je jednak jeszcze ułatwić oraz rozszerzyć za pomocą paczki Cobra. Co daje użycie takiej paczki? 

Wprowadza łatwą obsługę flag oraz tworzenie sub komend, dzięki czemu stworzenie grupy komend (na przykład “app server –port 8080”) będzie o wiele łatwiejsze. Dodatkowo paczka nakłada domyślną flagę “–help”, a jeśli użyjemy nieistniejącej flagi – dostaniemy w odpowiedzi listę dostępnych flag dla danej komendy.

Docker w testach integracyjnych

W poprzednich akapitach wspomniałem o przydatności pewnych technik w testach. Czas na narzędzia przydatne w testach integracyjnych, potrzebnych w przypadku tworzenia projektu opartego na architekturze mikroserwisów.

Narzędziem, o którym warto wspomnieć, jest dockertest stworzony przez zespół Ory. Pozwala w łatwy sposób zakodować uruchamianie kontenerów, z wszystkimi opcjami oferowanymi przez dockera. 

Dockertest pozwala na tworzenie:

  • instancji bazy danych, 
  • innego serwisu, z którym chcemy się połączyć, 
  • lokalnego AWS, a także 
  • każdego obrazu dostępnego w repozytorium Dockera.

AWS na Twoim komputerze

Dość popularnym elementem wielu projektów w dzisiejszych czasach jest integracja z Amazon Web Services (AWS). W przypadku Go wygląda to tak, jak w wielu innych technologiach, czyli mamy dostęp do oficjalnego AWS SDK. SDK w prosty sposób może nam posłużyć do integracji z dużą ilością dostępnych serwisów oraz oczywiście z praktycznie wszystkimi możliwymi ustawieniami. 

Dodatkowo bardzo przydatnym narzędziem związanym z AWS jest Localstack. Ten obraz Dockera pozwala na uruchomienie lokalnie najbardziej przydatnych serwisów AWS, takich jak: SES, SNS i SQS oraz różnych dostępnych w nich baz danych, jak np. DynamoDB.

Podczas używania tego narzędzia pewne bardziej skomplikowane zachowania AWS, uprawnienia i inne funkcje mogą być niedostępne lub zachowywać się nieco inaczej – na przykład domyślnie kolejki w SQS nie wymagają specjalnych uprawnień do subskrypcji w SNS. Są to niewielkie zmiany, jednakże lepiej zweryfikować wszystko na testowych zasobach prawdziwego AWS, żeby wprowadzając ostateczny deploy na produkcję, mieć spokojną głowę!

Jest to zaledwie skromna lista technik oraz narzędzi, które warto rozważyć podczas tworzenia oprogramowania w Go, także ze względu na ich uniwersalność w innych językach.

W kolejnych tekstach przedstawię m.in. zastosowania typowe dla mikroserwisów, jak użycie gRPC czy Protobuf oraz zagadnienie komunikacji asynchronicznej. Stay tuned!

On-demand webinar: Moving Forward From Legacy Systems

We’ll walk you through how to think about an upgrade, refactor, or migration project to your codebase. By the end of this webinar, you’ll have a step-by-step plan to move away from the legacy system.

Watch recording
moving forward from legacy systems - webinar

Latest blog posts

See more

Ready to talk about your project?

1.

Tell us more

Fill out a quick form describing your needs. You can always add details later on and we’ll reply within a day!

2.

Strategic Planning

We go through recommended tools, technologies and frameworks that best fit the challenges you face.

3.

Workshop Kickoff

Once we arrange the formalities, you can meet your Polcode team members and we’ll begin developing your next project.