Jak popularny jest język Go? Kraje zagraniczne, takie jak Google, AWS, Cloudflare, CoreOS itd., oraz krajowe firmy, takie jak Qiniu i Alibaba, zaczęły używać języka Go do rozwoju swoich produktów związanych z chmurą obliczeniową na dużą skalę. Na jakie "tak" i "ale" powinienem zwrócić uwagę, używając języka Go? Niedawno napisaliśmy API wykorzystujące język Go, otwartoźródłowy język programowania uruchomiony przez Google w 2009 roku. W trakcie korzystania z Go do rozwoju zdobyliśmy dużo doświadczenia i doświadczenia, które chcemy przekazać czytelnikom, dlatego mamy ten artykuł.
Wybierając język programowania do projektu, zawsze zalecamy zrozumienie, na czym projekt będzie budowany, zanim zastanowimy się, na którym języku programowania budować. Niech produkt będzie decydującym czynnikiem decydującym o tym, jak powinien być zbudowany.
Oto kilka zalet i wad, które znaleźliśmy podczas tworzenia w Go, aby pomóc Ci zrozumieć, czy to dobry wybór dla Twojego następnego projektu.
Co kochamy w Go
Użycie języka Go gwałtownie wzrosło w ostatnich latach. Wygląda na to, że każdy startup używa go do systemów backendowych. Jest wiele powodów, dla których twórcy uważają ją za tak popularną.
Język Go jest bardzo szybki
Go to bardzo szybki język programowania. Ponieważ Go jest kompilowany do kodu maszynowego, naturalnie przewyższa języki programowania interpretacyjne lub mające wirtualne środowisko działania. Programy w Go również kompilują się bardzo szybko i generują bardzo małe pliki binarne. Nasze API kompiluje się w zaledwie kilka sekund, co skutkuje plikiem wykonywalnym o rozmiarze zaledwie 11,5MB.
Łatwe do opanowania
Składnia języka Go jest prosta i łatwa do zrozumienia w porównaniu z innymi językami. Możesz zapamiętać większość składni Go w głowie, co oznacza, że nie musisz spędzać dużo czasu na szukaniu rzeczy. Język Go jest też bardzo przejrzysty i łatwy do czytania. Programiści spoza Go, zwłaszcza ci przyzwyczajeni do składni w stylu C, potrafią czytać kod programu Go i rozumieć, co się dzieje.
Statyczny język definicji typów
Go to potężny, statyczny język definiujący typ. Istnieją podstawowe typy, takie jak int, bajt i string. Istnieją także rodzaje konstrukcji. Jak w przypadku każdego języka silnie typowanego, system typów pozwala kompilatorowi pomóc wyłapać błędy dla całej klasy. Język Go ma także wbudowane listy i typy mapowania, które są łatwe w obsłudze.
Typ interfejsu
Język Go posiada typy interfejsów, a każda struktura może po prostu spełnić interfejs, implementując ten interfejs. Pozwala to rozdzielić zależności w kodzie. Możesz wtedy symulować swoje zależności w testach. Dzięki interfejsom możesz pisać bardziej modułowy, testowalny kod. Język Go posiada także funkcje najwyższej klasy, co pozwala deweloperom pisać kod w bardziej praktyczny sposób.
Standardowa biblioteka
Język Go ma całkiem dobrą standardową bibliotekę. Zapewnia wygodne, wbudowane funkcje do obsługi podstawowych typów. Niektóre pakiety ułatwiają budowanie serwera WWW, obsługę I/O, szyfrowanie oraz manipulację surowymi bajtami. Serializacja i deserializacja JSON oferowane przez standardową bibliotekę są bardzo proste. Używając "tagów", możesz określić nazwę pola JSON obok pola struct.
Wsparcie testowe
Wsparcie testów jest wbudowane w standardową bibliotekę i nie wymaga dodatkowych zależności. Jeśli masz plik o nazwie thing.go, napisz testy w innym pliku o nazwie thing_test.go i uruchom "go test". Go wykona te testy szybko.
Narzędzia analizy statycznej
Narzędzia do analizy statycznej w języku Go są liczne i potężne. Jednym z konkretnych narzędzi jest gofmt, który formatuje kod zgodnie ze stylem sugerowanym przez Go. To może znormalizować wiele opinii projektu, pozwalając menedżerowi nagród zespołu skupić się na pracy wykonanej przez kod. Na każdym buildzie uruchamiamy gofmt, golint i vet, i jeśli znajdziemy jakieś ostrzeżenia, build się nie powiedzie.
Zbieranie śmieci
Projektując język Go, zarządzanie pamięcią było celowo zaprojektowane tak, aby było łatwiejsze niż w C i C++. Celem dynamicznej alokacji jest zbieranie śmieci. Język Go czyni użycie wskaźników bezpieczniejszym, ponieważ nie pozwala na operacje wskaźnikowe. Dostępna jest także opcja użycia typów wartości.
Łatwiejszy model współbieżności
Chociaż programowanie współczesne nigdy nie jest łatwe, Go jest łatwiejsze do programowania równolegle niż inne języki. Stworzenie lekkiego wątku zwanego "goroutine" i komunikacja z nim przez "kanał" jest niemal prostym zadaniem, ale możliwe jest dla bardziej złożonych modeli.
Co nam się nie podoba w Go
Jak już wcześniej wspomnieliśmy, Go to rzeczywiście doskonały język. Ma przejrzystą składnię i jest szybki w wykonaniu. Ma też wiele zalet. Ale cały język programowania nie odnosi się tylko do jego składni. Oto niektóre z problemów, z którymi się spotkaliśmy.
Nie ma żadnych generyków
Po pierwsze, ten problem, jak słoń w pokoju, jest oczywistym i pomijanym faktem. W języku Go nie ma żadnych generyków. Dla programistów z języków takich jak Java przejście na Go to ogromna przeszkoda do pokonania. Oznacza to, że poziom ponownego wykorzystania kodu jest zmniejszony. Chociaż język Go ma funkcje najwyższej klasy, jeśli napiszesz takie funkcje jak "map", "reduce" i "filter", które są zaprojektowane do pracy na jednym typie kolekcji, nie możesz ich ponownie wykorzystać dla innych różnych typów kolekcji. Istnieje wiele sposobów rozwiązania tego problemu, ale wszystkie kończą się pisaniem większej ilości kodu, co obniża produktywność i utrzymanie.
Interfejs jest domyślny
Choć dobrze mieć interfejsy, struktura implementuje je domyślnie, a nie wprost. Mówi się, że to jedna z mocnych stron języka Go, ale trudno było nam stwierdzić na podstawie struktury, czy implementuje interfejsy, czy nie. Naprawdę możesz to zrozumieć tylko próbując skompilować program. Jeśli program jest mały, to na pewno nie ma w tym nic złego. Ale jeśli ten program jest średnio- lub duży, problem jest poważny.
Słabe wsparcie biblioteki
Wsparcie biblioteki Go jest nierówne. Nasze API integruje się z Contentful, ale ten ostatni nie posiada oficjalnie wspieranego SDK Go. Oznacza to, że musimy pisać (i utrzymywać!) Dużo kodu do żądania i analizowania danych w Contentful. Musimy też polegać na zewnętrznych bibliotekach Elasticsearch. SDK Go oferowane przez dostawców nie są tak popularne jak ich odpowiedniki w Javie, Ruby czy JavaScript.
Komunikacja ze społecznością jest trudna
Społeczność Go może nie przyjmować sugestii. Rozważ to w repozytorium GitHub golinta:Logowanie do linku jest widoczne., użytkownik poprosił, aby Golint mógł nie wykonać kompilacji po znalezieniu ostrzeżenia (co robimy w projekcie). Obrońcy natychmiast odrzucili ten pomysł. Jednak ponieważ zbyt wiele osób skomentowało problem, po roku opiekunowie musieli w końcu dodać żądane funkcje.
Społeczność Go też wydaje się nie przepadać za frameworkami webowymi. Chociaż biblioteka HTTP języka Go obejmuje wiele aspektów, nie obsługuje parametrów ścieżek, sprawdzania wejść ani walidacji, ani nie wspiera przekrojowych problemów powszechnych w aplikacjach internetowych. Programiści Ruby mają Rails, Java mają Spring MVC, a programiści Pythona mają Django. Jednak wielu deweloperów Go decyduje się unikać korzystania z frameworków. Jednak rzeczywistość jest taka, że nie ma żadnych ram, wręcz przeciwnie, jest ich wiele. Ale gdy już zaczniesz używać frameworka do projektu, prawie niemożliwe jest uniknięcie losu, jakim jest porzucenie.
Zarządzanie rozdrobnionymi zależnościami
Przez długi czas język Go nie miał stabilnego, formalnego menedżera pakietów. Po latach błagania społeczności, projekt Go dopiero niedawno wydał godep. Wcześniej istniało już wiele narzędzi, które miały wypełnić tę lukę. W naszym projekcie używamy bardzo potężnego dostawcy govendorów, ale oznacza to, że społeczność jest podzielona, co może być bardzo mylące dla deweloperów nowych w języku Go. Ponadto niemal wszystkie menedżery pakietów są zasilane przez repozytoria Git, a historia repozytoriów Git może się zmieniać w każdej chwili. Porównaj to z Maven Central, który nigdy nie usuwa ani nie zmienia bibliotek, od których zależy twój projekt.
Zdecyduj, czy użyć Go czy nie
Czasem trzeba pomyśleć o maszynie. Kiedy wysyłasz i odbierasz bajty. Gdy zarządzasz tysiącami równoległych procesów. Możesz także pisać system operacyjny, system kontenerowy lub węzeł blockchain. W takich przypadkach najprawdopodobniej nie będziesz się przejmować generykami. Bo jesteś zajęty wyciskaniem wydajności na nanosekundę z układu.
Jednak często trzeba myśleć o ludziach. Dane dotyczące obszarów biznesowych, z którymi musisz pracować: klienci, pracownicy, produkty, zamówienia. Musisz napisać logikę biznesową, która działa na tych podmiotach domenowych i utrzymać tę logikę przez wiele lat. I musi radzić sobie ze zmieniającymi się potrzebami, im szybciej, tym lepiej. W takich przypadkach ważne jest doświadczenie dewelopera.
Go to język programowania, który ceni czas maszynowy bardziej niż ludzki. Czasami w twojej dziedzinie najważniejsza jest wydajność maszyny lub programu. W takich przypadkach Go może być dobrą alternatywą dla C lub C++. Ale gdy piszesz typową aplikację n-tier, często pojawiają się wąskie gardła wydajności w bazie danych, a co ważniejsze, w sposobie modelowania danych.
Decydując o użyciu języka Go, rozważ następujące zasady:
- Jeśli masz do czynienia z bajtami, to język Go może być dobrym wyborem.
- Jeśli masz do czynienia z danymi, to język Go może nie być dobrym wyborem.
Może się to kiedyś zmieni. Język i społeczność Go, są wciąż młode. Mogą nas zaskoczyć dodatkiem generyków; Albo popularny framework webowy wygra dużo. Na razie jednak pozostaniemy przy dojrzałych językach programowania z uniwersalnym wsparciem, dojrzałym zarządzaniem zależnościami i skupieniem się na modelowaniu domeny biznesowej.
|