Hvor populært er Go-sproget? Udenlandske lande som Google, AWS, Cloudflare, CoreOS osv. og indenlandske virksomheder som Qiniu og Alibaba er begyndt at bruge Go-sproget til at udvikle deres cloud-computing-relaterede produkter i stor skala. Hvilke Ja og Men skal jeg være opmærksom på, når jeg bruger Go-sproget? For nylig skrev vi et API med Go-sproget, et open source-programmeringssprog, som Google lancerede i 2009. I processen med at bruge Go til udvikling har vi opnået meget erfaring og erfaring, og vi vil gerne dele det med læserne, så vi har denne artikel.
Når man vælger et programmeringssprog til et projekt, anbefaler vi altid, at man forstår, hvad projektet skal bygge ind i, før man overvejer, hvilket programmeringssprog man skal bygge videre på. Lad produktet være den afgørende faktor for, hvordan det skal bygges.
Her er nogle af de fordele og ulemper, vi har fundet ved udvikling med Go, for at hjælpe dig med at forstå, om det passer til dit næste projekt.
Hvad vi elsker ved Go
Brugen af Go-sproget er eksploderet i de senere år. Det virker som om, at alle startups bruger det til backend-systemer. Der er mange grunde til, at udviklerne anser det for så populært.
Go-sproget er meget hurtigt
Go er et meget hurtigt programmeringssprog. Fordi Go er kompileret til maskinkode, overgår det naturligt programmeringssprog, der er fortolkende eller har en virtuel runtime. Go-programmer kompilerer også meget hurtigt og producerer meget små binære filer. Vores API kompileres på blot få sekunder, hvilket resulterer i en eksekverbar fil, der er så lille som 11,5 MB.
Let at mestre
Syntaksen i Go-sproget er enkel og let at forstå sammenlignet med andre sprog. Du kan huske det meste af Go-syntaksen i dit hoved, hvilket betyder, at du ikke behøver bruge meget tid på at lede efter ting. Go-sproget er også meget rent og let at læse. Non-Go-programmører, især dem der er vant til C-stil syntaks, kan læse Go-programkode og forstå, hvad der sker.
Statisk typedefinitionssprog
Go er et kraftfuldt statisk typedefinerende sprog. Der findes grundlæggende typer som int, byte og string. Der findes også typer af strukturer. Som med ethvert stærkt typet sprog tillader typesystemet, at kompilatoren kan hjælpe med at fange fejl for hele klassen. Go-sproget har også indbyggede liste- og korttyper, og de er også nemme at bruge.
Grænsefladetype
Go-sproget har interface-typer, og enhver struktur kan blot opfylde et interface ved at implementere interfacet. Dette giver dig mulighed for at adskille afhængigheder i din kode. Du kan derefter simulere dine afhængigheder i dine tests. Ved at bruge interfaces kan du skrive mere modulær, testbar kode. Go-sproget har også førsteklasses funktioner, hvilket gør det muligt for udviklere at skrive kode på en mere praktisk måde.
Standardbibliotek
Go-sproget har et ret godt standardbibliotek. Den tilbyder praktiske indbyggede funktioner til håndtering af grundlæggende typer. Nogle pakker gør det nemt at bygge en webserver, håndtere I/O, bruge kryptering og manipulere råbytes. JSON-serialiseringen og deserialiseringen, som standardbiblioteket leverer, er meget enkel. Ved at bruge "tags" kan du angive JSON-feltnavnet ved siden af struct-feltet.
Testunderstøttelse
Testunderstøttelse er indbygget i standardbiblioteket og kræver ingen yderligere afhængigheder. Hvis du har en fil, der hedder thing.go, så skriv tests i en anden fil, der hedder thing_test.go, og kør "go test". Go vil udføre disse tests hurtigt.
Statiske analyseværktøjer
De statiske analyseværktøjer til Go-sproget er mange og kraftfulde. Et særligt værktøj er gofmt, som formaterer kode efter Gos foreslagne stil. Dette kan normalisere mange af projektets meninger, så teamets awardmanager kan fokusere på det arbejde, koden har udført. Vi kører gofmt, golint og vet på hvert build, og hvis vi finder advarsler, fejler buildet.
Affaldsindsamling
Ved designet af Go-sproget blev hukommelsesstyring bevidst designet til at være lettere end C og C++. Formålet med dynamisk allokering er garbage collection. Go-sproget gør brugen af pointere mere sikker, fordi det ikke tillader pointeroperationer. Muligheden for at bruge værdityper er også tilgængelig.
Nemmere samtidighedsmodel
Selvom samtidig programmering aldrig er let, er Go lettere at programmere samtidig end andre sprog. At oprette en letvægtstråd kaldet "goroutine" og kommunikere med den via "kanal" er næsten en simpel opgave, men det er muligt for mere komplekse modeller.
Hvad vi ikke kan lide ved Go
Som vi diskuterede tidligere, er Go virkelig et fremragende sprog. Den har en ren syntaks og er hurtig at udføre. Det har også mange fordele. Men hele et programmeringssprog refererer ikke kun til dets syntaks. Her er nogle af de problemer, vi stødte på.
Der findes ingen generiske
For det første er dette problem, som en elefant i rummet, en åbenlys og overset kendsgerning. Der findes ingen generiske udtryk i Go-sproget. For udviklere fra sprog som Java er det en stor udfordring at overvinde at skifte til Go. Det betyder, at genbrugsniveauet af koden reduceres. Selvom Go-sproget har førsteklasses funktioner, kan du ikke genbruge disse funktioner til andre typer samlinger, hvis du skriver funktioner som "map", "reduce" og "filter", som er designet til at fungere på én type samling. Der er mange måder at løse dette problem på, men de ender alle med at skrive mere kode, hvilket reducerer produktiviteten og vedligeholdelsen.
Grænsefladen er implicit
Selvom det er rart at have interfaces, implementerer strukturen interfaces implicit frem for eksplicit. Dette siges at være en af styrkerne ved Go-sproget, men vi fandt det svært ud fra strukturen at afgøre, om det implementerede grænseflader eller ej. Man kan kun rigtig forstå det ved at prøve at kompilere programmet. Hvis programmet er lille, er der bestemt ikke noget galt i det. Men hvis dette program er mellemstort til storskala, er problemet stort.
Dårlig bibliotekssupport
Go Library-supporten er ujævn. Vores API integreres med Contentful, men sidstnævnte har ikke et officielt understøttet Go SDK. Det betyder, at vi skal skrive (og vedligeholde!) Der er meget kode at anmode om og analysere data i Contentful. Vi er også nødt til at stole på tredjeparts Elasticsearch-biblioteker. Go SDK'er leveret af leverandører er ikke lige så populære som deres Java-, Ruby- eller JavaScript-modstykker.
Kommunikation i lokalsamfundet er vanskelig
Go-fællesskabet accepterer måske ikke forslag. Overvej dette i Golints GitHub-repository:Hyperlink-login er synlig., en bruger bad om, at Golint skulle kunne fejle buildet, da den fandt en advarsel (hvilket vi gør i projektet). Forsvarerne afviste straks idéen. Men da for mange kommenterede på problemet, måtte vedligeholderne efter et år endelig tilføje de ønskede funktioner.
Go-fællesskabet ser heller ikke ud til at bryde sig om webframeworks. Selvom Go-sprogets HTTP-bibliotek dækker mange aspekter, understøtter det ikke stiparametre, inputkontrol og validering, og det understøtter heller ikke tværgående bekymringer, som er almindelige i webapplikationer. Ruby-udviklere har Rails, Java-udviklere har Spring MVC, og Python-udviklere har Django. Men mange Go-udviklere vælger at undgå at bruge frameworks. Men realiteten er, at der ikke findes nogen rammer, tværtimod, der er mange. Men når man først begynder at bruge en ramme til et projekt, er det næsten umuligt at undgå skæbnen om at blive forladt.
Fragmenteret afhængighedsstyring
I lang tid havde Go-sproget ikke en stabil, formel pakkehåndtering. Efter mange års bøn fra fællesskabet har Go-projektet først for nylig udgivet godep. Før det var der allerede mange værktøjer til at udfylde dette hul. Vi bruger en meget kraftfuld Govendor i vores projekt, men det betyder, at fællesskabet er splittet, hvilket kan være meget forvirrende for udviklere, der er nye i Go-sproget. Derudover drives næsten alle pakkeadministratorer af Git-repositorier, og historikken for Git-repositorier kan ændre sig når som helst. Sammenlign det med Maven Central, som aldrig sletter eller ændrer de biblioteker, dit projekt er afhængigt af.
Beslut om du vil bruge Go eller ej
Nogle gange skal man tænke på maskinen. Når du sender og modtager bytes. Når du håndterer tusindvis af samtidige processer. Du kan også skrive et operativsystem, containersystem eller blockchain-node. I disse tilfælde vil du sandsynligvis ikke bekymre dig om generiske lægemidler. Fordi du er optaget af at presse ydeevne pr. nanosekund ud af chippen.
Men mange gange skal man tænke på mennesker. Forretningsområdedata, du skal arbejde med: kunder, medarbejdere, produkter, ordrer. Du skal skrive forretningslogikken, der opererer på disse domæneenheder, og du skal vedligeholde denne forretningslogik i mange år. Og den skal håndtere skiftende behov, og jo hurtigere, jo bedre. I disse tilfælde er udviklerens erfaring vigtig.
Go er et programmeringssprog, der værdsætter maskintid højere end menneskelig tid. Nogle gange er maskinens eller programmets ydeevne det mest kritiske i dit felt. I disse tilfælde kan Go være et godt alternativ til C eller C++. Men når man skriver en typisk n-tier-applikation, opstår der ofte flaskehalse i ydeevnen og, vigtigst af alt, i hvordan man vil modellere dataene.
Når du beslutter, om du vil bruge Go-sproget, bør du overveje følgende tommelfingerregler:
- Hvis du arbejder med bytes, kan Go-sproget være et godt valg.
- Hvis du arbejder med data, er Go-sproget måske ikke et godt valg.
Dette kan ændre sig en dag i fremtiden. Go-sproget og fællesskabet er stadig unge. De kan overraske os med tilføjelsen af generika; Eller et populært webframework vil vinde stort. Men indtil videre holder vi os til modne programmeringssprog med universel understøttelse, moden afhængighedsstyring og fokus på forretningsdomænemodellering.
|