Mennyire népszerű a Go nyelv? Külföldi országok, mint a Google, AWS, Cloudflare, CoreOS stb., valamint hazai cégek, mint a Qiniu és az Alibaba, elkezdték használni a Go nyelvet felhőalapú termékeik nagy léptékben történő fejlesztéséhez. Milyen igenekre és de igenekre kell figyelnem, amikor a Go nyelvet használom? Nemrégiben egy API-t írtunk Go nyelven, egy nyílt forráskódú programozási nyelven, amelyet a Google indított el 2009-ben. A Go fejlesztésének folyamata során rengeteg tapasztalatot és tapasztalatot szereztünk, és szeretnénk megosztani az olvasókkal, ezért van ez a cikkünk.
Amikor programozási nyelvet választunk egy projekthez, mindig azt javasoljuk, hogy megértsük, mire épül a projekt, mielőtt eldöntenéd, melyik programozási nyelvre építünk. Legyen a termék a döntő tényező abban, hogyan kell építeni.
Íme néhány előnye és hátránya, amit a Go fejlesztése során tapasztaltunk, hogy megértsd, alkalmas-e a következő projektedre.
Amit szeretünk a Go-ban
A Go nyelv használata az utóbbi években robbanásszerűen megnőtt. Úgy tűnik, minden startup használja ezt háttérrendszerekhez. Sok oka van annak, hogy a fejlesztők ilyen népszerűnek tartják.
A Go nyelv nagyon gyors
A Go egy nagyon gyors programozási nyelv. Mivel a Go gépi kódba van fordítva, természetesen felülmúlja azokat a programozási nyelveket, amelyek értelmezőek vagy virtuális futásidővel rendelkeznek. A Go programok nagyon gyorsan kompetálódnak, és nagyon kis bináriakat hoznak létre. Az API-nk néhány másodperc alatt kompetálódik, így egy futtatható fájl születik, amely akár 11,5MB méretű.
Könnyű elsajátítani
A Go nyelv szintaxisa egyszerű és könnyen érthető más nyelvekhez képest. A Go szintaxisának nagy részét fejben tudod megjegyezni, így nem kell sok időt tölteni a dolgok keresésével. A Go nyelv nagyon tiszta és könnyen olvasható. A nem Go programozók, különösen azok, akik hozzászoktak a C-stílusú szintaxishoz, képesek olvasni a Go programkódot és megérteni, mi történik.
Statikus típusdefiníciós nyelv
A Go egy erős, statikus típusmeghatározó nyelv. Alapvető típusok léteznek, mint az int, byte és string. Vannak szerkezettípusok is. Mint minden erősen típusozott nyelvnél, a típusrendszer lehetővé teszi a fordító számára, hogy az egész osztály hibáit elkapja. A Go nyelvben beépített lista- és térképtípusok is vannak, és ezek könnyen használhatók.
Interfész típus
A Go nyelvnek vannak interfésztípusai, és bármely struktúra egyszerűen kielégítheti az interfészt az interfész megvalósításával. Ez lehetővé teszi, hogy a kódodban elválaszthatod a függőségeket. Ezután szimulálhatod a függőségeidet a teszteidben. Interfészek használatával modulárisabb, tesztelhetőbb kódot lehet írni. A Go nyelv első osztályú funkciókkal is rendelkezik, ami lehetővé teszi a fejlesztők számára, hogy gyakorlatiasabb módon írjanak kódot.
Szabványos könyvtár
A Go nyelvnek elég jó szabványos könyvtára van. Kényelmes beépített funkciókat biztosít az alapvető típusok kezelésére. Néhány csomag megkönnyíti webszerver építését, az I/O kezelését, titkosítást és nyers bájtokat kezelni. A standard könyvtár által biztosított JSON serializáció és deserializáció nagyon egyszerű. A "tags" használatával megadhatod a JSON mező nevét a struct pálya mellett.
Tesztelési támogatás
A teszttámogatás beépített a szabványos könyvtárba, és nem igényel további függőséget. Ha van egy thing.go nevű fájlod, írj teszteket egy másik fájlba, a thing_test.go-ba, és futtasd a "go test"-et. A Go gyorsan elvégzi ezeket a teszteket.
Statikus elemző eszközök
A Go nyelv statikus elemző eszközei számosak és hatékonyak. Egy különleges eszköz a gofmt, amely a kódot a Go által javasolt stílus szerint formázza. Ez normalizálhatja a projekt véleményét, lehetővé téve, hogy a csapat díjadozó menedzsere a kód által végzett munkára koncentráljon. Minden builden futtatjuk a gofmt, golintot és vet rendszereket, és ha bármilyen figyelmeztetést találunk, az összeállítás megbukik.
Szemétgyűjtő
A Go nyelv tervezésekor a memóriakezelést szándékosan úgy tervezték, hogy könnyebb legyen, mint a C és C++. A dinamikus allokáció tárgya a szemétgyűjtés. A Go nyelv biztonságosabbá teszi a mutató használatát, mert nem engedélyezi az mutató műveleteket. Az értéktípusok használata is elérhető.
Egyszerűbb párhuzamos modell
Bár a párhuzamos programozás sosem egyszerű, a Go programozása könnyebb egyszerre, mint más nyelvek. Egy könnyű, "goroutine" nevű szál létrehozása és vele való kommunikáció "csatornán" keresztül szinte egyszerű feladat, de összetettebb modellekhez is lehetséges.
Amit nem szeretünk a Go-ban
Ahogy korábban is tárgyaltuk, a Go valóban kiváló nyelv. Tiszta szintaxisa van, és gyorsan végrehajtható. Számos előnye is van. De egy programozási nyelv egészében nem csak a szintaxisára utal. Íme néhány probléma, amelyekkel szembesültünk.
Nincsenek generikus
Először is, ez a probléma, mint egy elefánt a szobában, nyilvánvaló és figyelmen kívül hagyott tény. A Go nyelvben nincsenek generikák. Olyan nyelveken dolgozó fejlesztők számára, mint a Java, a Go-ra váltás hatalmas akadály. Ez azt jelenti, hogy a kód újrahasznosítási szintje csökken. Bár a Go nyelv első osztályú funkciókat tartalmaz, ha olyan függvényeket írsz, mint a "map", "reduce" és "filter", amelyek egy gyűjteménytípusra vannak tervezve, ezeket a függvényeket nem lehet újrahasznosítani más gyűjteménytípusokhoz. Sokféle módja van ennek a problémának a megoldásának, de mindegyik több kódot ír, ami csökkenti a termelékenységet és a fenntarthatóságot.
Az interfész implicit
Bár jó az interfészek létezése, a struktúra inkább implicit módon valósítja meg az interfészeket, nem pedig expliciten. Ezt állítják a Go nyelv egyik erőssége, de a szerkezetből nehéz volt megállapítani, hogy interfészeket valósít-e meg vagy sem. Csak akkor értheted meg igazán, ha megpróbálod fordítani a programot. Ha a program kicsi, akkor semmi baj nincs vele. De ha ez a program közepes vagy nagyszabású, akkor a probléma nagy.
Gyenge könyvtári támogatás
A Go könyvtári támogatás egyenetlen. Az API-nk integrálódik a Contentful-val, de utóbbinak nincs hivatalosan támogatott Go SDK-ja. Ez azt jelenti, hogy írnunk (és karbantartanunk!) Rengeteg kódot kell kérni és adatokat elemzni a Contentfulban. Emellett harmadik féltől származó Elasticsearch könyvtárakra is támaszkodnunk kell. A gyártók által biztosított Go SDK-k nem olyan népszerűek, mint a Java, Ruby vagy JavaScript megfelelőik.
A közösségi kommunikáció nehéz
A Go közösség nem feltétlenül fogadja el az ajánlatokat. Vegyük ezt a Golint GitHub repozióriumában:A hiperlink bejelentkezés látható., egy felhasználó kérte, hogy a Golint hibát adjon a buildből, amikor figyelmeztetést talált (amit mi is csinálunk a projektben). A védők azonnal elutasították az ötletet. Azonban mivel túl sokan kommentálták a problémát, egy év után a karbantartóknak végre hozzá kellett adniuk a kért funkciókat.
A Go közösség sem tűnik úgy, hogy kedveli a webes keretrendszereket. Bár a Go nyelv HTTP könyvtára sok szempontot lefed, nem támogatja az útparamétereket, a bemeneti ellenőrzést és az ellenőrzést, és nem támogatja a webalkalmazásokban gyakori keresztmetsző problémákat. A Ruby fejlesztőknek van Rails, a Java fejlesztőknek a Spring MVC-jük, a Python fejlesztőknek Django. De sok Go fejlesztő inkább elkerüli a keretrendszerek használatát. Azonban a valóság az, hogy nincsenek keretrendszerek, épp ellenkezőleg, sok van. De ha egyszer elkezdesz egy keretrendszert használni egy projekthez, szinte lehetetlen elkerülni az elhagyatás sorsát.
Fragmentált függőségkezelés
Hosszú ideig a Go nyelvnek nem volt stabil, formális csomagkezelője. Évekig tartó közösségi könyörgés után a Go projekt csak nemrég adta ki a godepot. Előtte már sok eszköz volt ennek a hiánynak a pótlására. Nagyon erős govendort használunk a projektünkben, de ez azt jelenti, hogy a közösség megosztott, ami nagyon zavaró lehet azoknak a fejlesztőknek, akik újak a Go nyelven. Ezen felül szinte minden csomagkezelőt Git tárolók működtetnek, és a Git tárolók története bármikor változhat. Hasonlítsd össze a Maven Central-ral, amely soha nem törli vagy változtatja azokat a könyvtárakat, amelyekre a projekted támaszkodik.
Döntsd el, hogy a Go használata mellett
Néha a gépre is gondolni kell. Amikor bájtokat küldsz és fogadsz. Amikor több ezer egyidejű folyamatot kezelsz. Lehet, hogy operációs rendszert, konténer rendszert vagy blokklánc csomópontot is írsz. Ilyen esetekben valószínűleg nem fognak érdekelni a generikusok. Mert azzal foglalkozol, hogy nanoszendumonként a chipből teljesítményt préselsz.
Azonban sokszor az emberekre is gondolni kell. Üzleti területi adatok, amelyekkel dolgozni kell: ügyfelek, alkalmazottak, termékek, megrendelések. Meg kell írnod az üzleti logikát, amely ezeken a domainentitásokon működik, és ezt az üzleti logikát évekig kell fenntartani. És meg kell birkóznia a változó igényekkel, és minél gyorsabb, annál jobb. Ezekben az esetekben a fejlesztő tapasztalata fontos.
A Go egy olyan programozási nyelv, amely a gépi időt jobban értékeli, mint az emberi időt. Néha a te területedben a gép vagy a program teljesítménye a legkritikusabb. Ilyen esetekben a Go jó C vagy C++ alternatíva lehet. De amikor tipikus n-szintű alkalmazást írsz, gyakran előfordulnak teljesítményszűk keresztmetszetek az adatbázisban, és ami még fontosabb, abban, hogyan fogod modellezni az adatokat.
Amikor eldönti, hogy használjuk-e a Go nyelvet, vegye figyelembe a következő ökölszabályokat:
- Ha bájtokkal foglalkozol, akkor a Go nyelv jó választás lehet.
- Ha adatokkal foglalkozol, akkor a Go nyelv nem biztos, hogy jó választás.
Ez talán egy nap a jövőben megváltozhat. A Go nyelv és közösség még fiatal. Meglephetnek minket a generikusok hozzáadásával; Vagy egy népszerű webes rendszer nagy nyerést nyer. Egyelőre azonban kitartunk érett programozási nyelveknél, amelyek univerzális támogatással, érett függőségkezeléssel és az üzleti domain modellezésre fókuszálnak.
|