Cât de populară este limba Go? Țări străine precum Google, AWS, Cloudflare, CoreOS etc., și companii interne precum Qiniu și Alibaba au început să folosească limbajul Go pentru a-și dezvolta produsele legate de cloud computing la scară largă. La ce Da și Dar ar trebui să fiu atent când folosesc limbajul Go? Recent, am scris un API folosind limbajul Go, un limbaj de programare open-source lansat de Google în 2009. În procesul de utilizare a Go pentru dezvoltare, am acumulat multă experiență și dorim să o împărtășim cititorilor, așa că avem acest articol.
Când alegi un limbaj de programare pentru un proiect, recomandăm întotdeauna să înțelegi în ce va construi proiectul înainte de a lua în considerare pe ce limbaj de programare să construiască. Lasă produsul să fie factorul decisiv în modul în care ar trebui construit.
Iată câteva dintre avantajele și dezavantajele pe care le-am descoperit când dezvoltăm cu Go pentru a te ajuta să înțelegi dacă este potrivit pentru următorul tău proiect.
Ce iubim la Go
Utilizarea limbii Go a explodat în ultimii ani. Se pare că fiecare startup îl folosește pentru sisteme backend. Există multe motive pentru care dezvoltatorii îl consideră atât de popular.
Limba Go este foarte rapidă
Go este un limbaj de programare foarte rapid. Deoarece Go este compilat în cod mașină, în mod natural depășește limbajele de programare interpretative sau care au un runtime virtual. Programele Go se compilează foarte rapid și produc binare foarte mici. API-ul nostru se compilează în doar câteva secunde, rezultând un fișier executabil de doar 11,5MB.
Ușor de stăpânit
Sintaxa limbajului Go este simplă și ușor de înțeles comparativ cu alte limbaje. Poți memora majoritatea sintaxei Go-ului în minte, ceea ce înseamnă că nu trebuie să petreci mult timp căutând lucruri. Limba Go este, de asemenea, foarte curată și ușor de citit. Programatorii non-Go, mai ales cei obișnuiți cu sintaxa de tip C, pot citi codul programului Go și pot înțelege ce se întâmplă.
Limbaj static de definire a tipurilor
Go este un limbaj static puternic care definește tipurile. Există tipuri de bază precum int, byte și string. Există și tipuri de structuri. Ca în orice limbaj cu tipuri puternice, sistemul de tipuri permite compilatorului să ajute la detectarea erorilor pentru întreaga clasă. Limbajul Go are, de asemenea, liste și tipuri de mapare integrate, iar acestea sunt și ele ușor de folosit.
Tip de interfață
Limbajul Go are tipuri de interfețe, iar orice structură poate satisface pur și simplu o interfață prin implementarea acesteia. Acest lucru îți permite să decuplezi dependențele din codul tău. Poți apoi să-ți simulezi dependențele în teste. Folosind interfețe, poți scrie cod mai modular, testabil. Limbajul Go are, de asemenea, funcții de primă clasă, ceea ce permite dezvoltatorilor să scrie cod într-un mod mai practic.
Bibliotecă standard
Limbajul Go are o bibliotecă standard destul de bună. Oferă funcții încorporate convenabile pentru gestionarea tipurilor de bază. Unele pachete facilitează construirea unui server web, gestionarea I/O, folosirea criptării și manipularea byte-urilor brute. Serializarea și deserializarea JSON oferite de biblioteca standard sunt foarte simple. Folosind "tags", poți specifica numele câmpului JSON lângă câmpul struct.
Suport pentru testare
Suportul pentru testare este integrat în biblioteca standard și nu necesită dependențe suplimentare. Dacă ai un fișier numit thing.go, scrie teste într-un alt fișier numit thing_test.go și rulează "go test". Go va efectua aceste teste rapid.
Instrumente de analiză statică
Instrumentele de analiză statică pentru limbajul Go sunt numeroase și puternice. Un instrument anume este gofmt, care formatează codul conform stilului sugerat de Go. Acest lucru poate normaliza multe dintre opiniile proiectului, permițând managerului echipei să se concentreze pe munca făcută de cod. Rulăm gofmt, golint și vet pe fiecare build, iar dacă găsim avertismente, build-ul va eșua.
Colectarea gunoiului
La proiectarea limbajului Go, gestionarea memoriei a fost intenționat concepută să fie mai ușoară decât C și C++. Obiectul alocării dinamice este colectarea gunoiului. Limbajul Go face utilizarea pointerului mai sigură deoarece nu permite operațiuni cu pointerul. Este oferită și opțiunea de a folosi tipurile de valoare.
Modelul de concurență mai ușor
Deși programarea concurentă nu este niciodată ușoară, Go este mai ușor de programat simultan decât alte limbaje. Crearea unui fir ușor numit "goroutine" și comunicarea cu el prin "canal" este aproape o sarcină simplă, dar este posibilă pentru modele mai complexe.
Ce nu ne place la Go
Așa cum am discutat mai devreme, Go este într-adevăr o limbă excelentă. Are o sintaxă curată și este rapid de executat. Are și multe avantaje. Dar întregul limbaj de programare nu se referă doar la sintaxa sa. Iată câteva dintre problemele cu care ne-am confruntat.
Nu există generice
În primul rând, această problemă, ca un elefant într-o cameră, este un fapt evident și trecut cu vederea. Nu există generice în limba Go. Pentru dezvoltatorii din limbaje precum Java, trecerea la Go este un obstacol uriaș de depășit. Aceasta înseamnă că nivelul de reutilizare al codului este redus. Deși limbajul Go are funcții de primă clasă, dacă scrii funcții precum "map", "reduce" și "filter", care sunt concepute să funcționeze pe un anumit tip de colecție, nu poți reutiliza aceste funcții pentru alte tipuri diferite de colecții. Există multe moduri de a rezolva această problemă, dar toate ajung să scrie mai mult cod, ceea ce reduce productivitatea și mentenabilitatea.
Interfața este implicită
Deși este plăcut să ai interfețe, structura implementează interfețele implicit, nu explicit. Se spune că acesta este unul dintre punctele forte ale limbajului Go, dar ne-a fost greu să ne dăm seama din structură dacă implementează sau nu interfețe. Poți înțelege cu adevărat doar încercând să compilezi programul. Dacă programul este mic, cu siguranță nu este nimic rău în asta. Dar dacă acest program este de scară medie sau mare, problema este mare.
Sprijin slab pentru biblioteci
Suportul pentru biblioteca Go este inegal. API-ul nostru se integrează cu Contentful, dar acesta din urmă nu are un SDK Go oficial suportat. Asta înseamnă că trebuie să scriem (și să menținem!) E mult cod pentru a solicita și analiza datele în Contentful. De asemenea, trebuie să ne bazăm pe biblioteci Elasticsearch de la terți. SDK-urile Go oferite de furnizori nu sunt la fel de populare ca omologii lor din Java, Ruby sau JavaScript.
Comunicarea în comunitate este dificilă
Comunitatea Go este posibil să nu accepte sugestii. Ia în considerare asta în depozitul GitHub al lui golint:Autentificarea cu hyperlink este vizibilă., un utilizator a cerut ca Golint să poată eșua build-ul când găsește un avertisment (ceea ce facem noi în proiect). Apărătorii au respins imediat ideea. Totuși, deoarece prea mulți au comentat problema, după un an, administratorii au fost nevoiți în cele din urmă să adauge funcțiile solicitate.
Comunitatea Go nu pare să fie încântată nici ea de framework-urile web. Deși biblioteca HTTP a limbajului Go acoperă multe aspecte, nu suportă parametri de traseu, verificarea inputurilor și validarea, nici preocupări transversale comune în aplicațiile web. Dezvoltatorii Ruby au Rails, dezvoltatorii Java au Spring MVC, iar dezvoltatorii Python au Django. Dar mulți dezvoltatori Go aleg să evite utilizarea framework-urilor. Totuși, realitatea este că nu există cadre, dimpotrivă, există multe. Dar odată ce începi să folosești un cadru pentru un proiect, devine aproape imposibil să eviți soarta abandonului.
Managementul dependențelor fragmentate
Mult timp, limbajul Go nu a avut un manager de pachete stabil și formal. După ani de rugăminți din comunitate, proiectul Go a lansat godep abia recent. Înainte de asta, existau deja multe instrumente pentru a umple acest gol. Folosim un govendor foarte puternic în proiectul nostru, dar asta înseamnă că comunitatea este divizată, ceea ce poate fi foarte confuz pentru dezvoltatorii care sunt noi în limbajul Go. În plus, aproape toți managerii de pachete sunt alimentați de depozite Git, iar istoricul depozitelor Git se poate schimba oricând. Compară cu Maven Central, care nu șterge sau modifică niciodată bibliotecile de care depinde proiectul tău.
Decide dacă să folosești Go sau nu
Uneori, trebuie să te gândești la aparat. Când trimiți și primești octeți. Când gestionezi mii de procese simultane. De asemenea, poți scrie un sistem de operare, un sistem container sau un nod blockchain. În aceste cazuri, cel mai probabil nu te va interesa genericele. Pentru că ești ocupat să stoarci performanța pe nanosecundă de la cip.
Totuși, de multe ori, trebuie să te gândești la oameni. Date despre zonele de business cu care trebuie să lucrezi: clienți, angajați, produse, comenzi. Trebuie să scrii logica de business care operează asupra acestor entități de domeniu și să menții această logică de business mulți ani. Și trebuie să facă față nevoilor în schimbare, iar cu cât mai repede, cu atât mai bine. În aceste cazuri, experiența dezvoltatorului este importantă.
Go este un limbaj de programare care prețuiește timpul mașinii mai mult decât timpul uman. Uneori, în domeniul tău, performanța mașinii sau a programului este cea mai critică. În aceste cazuri, Go poate fi o alternativă bună la C sau C++. Dar când scrii o aplicație tipică n-level, apar adesea blocaje de performanță în baza de date și, mai important, în modul în care vei modela datele.
Când decizi dacă să folosești limbajul Go, ia în considerare următoarele reguli de bază:
- Dacă ai de-a face cu octeți, atunci limbajul Go ar putea fi o alegere bună.
- Dacă lucrezi cu date, atunci limbajul Go s-ar putea să nu fie o alegere bună.
Acest lucru s-ar putea schimba într-o zi în viitor. Limba și comunitatea Go sunt încă tinere. Ne pot surprinde cu adăugarea genericelor; Sau un framework web popular va câștiga la maximum. Totuși, pentru moment, vom rămâne la limbaje de programare mature, cu suport universal, management matur al dependențelor și accent pe modelarea domeniului de business.
|