Gå | ||
---|---|---|
Utvikler(e) | ||
Google https://golang.org og https://go.dev | ||
Generell informasjon | ||
Vanlige utvidelser | .gå | |
Paradigme | kompilert samtidig , imperativ , strukturert [ 1 ] [ 2 ] [ 3 ] | |
Dukket opp i | 2009 | |
Designet av | Robert Griesemer , Rob Pike og Ken Thompson | |
Siste stabile versjon | 1.18 [ 4 ] ( 15. mars 2022 (7 måneder og 3 dager)) | |
type system | sterk, statisk | |
implementeringer | gc (8g, 6g, 5g), gccgo | |
påvirket av | C , Modula-2 , Pascal , Oberon , Limbo | |
Operativsystem | GNU/Linux , Mac OS X , Windows , andre [ 5 ] [ 6 ] | |
Tillatelse | BSD [ 7 ] + patentbevilgning [ 8 ] _ | |
Go er et statisk skrevet kompilert og samtidig programmeringsspråk inspirert av C-syntaks , men med minnesikkerhet og søppelinnsamling . Den er utviklet av Google [ 9 ] og dens første designere var Robert Griesemer , Rob Pike og Ken Thompson . [ 10 ] Det er for øyeblikket tilgjengelig i binært format for Windows , GNU/Linux , FreeBSD og Mac OS X operativsystemer , og kan også installeres på disse og andre systemer gjennom kildekode. [ 11 ] [ 12 ] Go er et kompilert , samtidig , imperativt , strukturert , objektorientert programmeringsspråk for øyeblikket tilgjengelig for mange forskjellige typer Unix-lignende systemer , inkludert Linux , FreeBSD , Mac OS X og Plan 9 (siden del av kompilatoren er basert på tidligere arbeid med Inferno -operativsystemet ). Støttede arkitekturer er i386 , amd64 og ARM .
På dagen for Go-språkutgivelsen, Francis McCabe, utvikler av Go! (tidligere kalt Go), ba om at Googles språk ble omdøpt for å unngå forvirring med språket. [ 13 ] McCabe opprettet Go! i år 2003; men han har ennå ikke registrert navnet. [ 14 ] Go er et nytt programmeringsspråk for systemer utgitt av Google i november 2009. Selv om det begynte å bli utviklet i september 2007 av Robert Griesemer, Rob Pike og Ken Thompson.
Go bruker ikke unntak . [ 21 ] Språkets skapere har gitt ulike grunner til at dette er tilfelle. Den viktigste er at å legge til et unntakslag gir unødvendig kompleksitet til språket og kjøretidsmiljøet. Per definisjon bør unntak være eksepsjonelle, men til slutt ender de opp med å bli brukt som applikasjonsflytkontrollere og har ikke lenger som formål å være eksepsjonelle. I følge skaperne må unntakene være virkelig eksepsjonelle, og bruken som for det meste gis dem rettferdiggjør ikke deres eksistens.
Dessuten resulterer det i flyter med ikke-opplagte hopp. For eksempel, et ubehandlet unntak i en funksjon, som var forventet å mislykkes, fører utførelse til den første fangsten som påtreffes. Det kan gjøre feilsøking vanskelig.
Andre moderne språk som Rust har også unnlatt unntak av samme grunner.
Selv om syntaksen er lik, skiller Go seg mye fra C. Se noen eksempler.
I Go gjøres erklæringene baklengs fra perspektivet til C (eller C++ eller Java). Hovedideen i C er at en variabel er deklarert som et uttrykk som angir typen. Ifølge skaperne, selv om ideen bak C-type-deklarasjoner er god, blander ikke typer og grammatikkuttrykk seg godt, og resultatet kan være forvirrende. Go skiller imidlertid uttrykket og typesyntaksen, noe som gjør ting enklere.
I C er det nødvendig å bruke parenteser når du evaluerer uttrykk i kontrollstrukturer (for eksempel i if-then-else og for-next- strukturer ). I Go anses det som ikke-idiomatisk å bruke parenteser i kontrollstrukturer.
I Go er bruken av semikolontegnet ";" på slutten av en setning valgfri.
Go har ingen peker-aritmetikk. Ifølge skaperne er årsaken sikkerhet. Uten pekereritmetikk er det mulig å lage et språk der du ikke kan få en ulovlig adresse til å bli misbrukt. Mangelen på peker-aritmetikk forenkler implementeringen av søppelsamleren. Dessuten, ved å optimalisere kompilatoren og med gjeldende maskinvare, kan en sløyfe som bruker indeksene til en matrise være like effektiv som en sløyfe som bruker pekeraritmetikk.
I Go er bruken av ++ og -- for å øke og redusere verdien av en variabel en setning og ikke et uttrykk. I tillegg kan den bare brukes i sin postfix-versjon fordi, ifølge forfatterne, mister prefiksversjonen all sin mening i fravær av peker-aritmetikk.
For noen forfattere er ikke arv eller klasser essensielle konsepter for OOP-paradigmet , men snarere et middel for implementering. Det har vært objektorienterte språk i lang tid som ikke støtter klasser, men er basert på prototyper, som Javascript eller Self . I følge uttalelser fra Alan Kay , skaperen av Smalltalk , er essensen av paradigmet budskap som passerer . [ 22 ]
Go har typer og metoder , og åpner for en objektorientert programmeringsstil som erstatter bruken av klasser med strukturer som støtter bygging av hierarkier, det vil si at den ikke støtter arv og favoriserer komposisjonsmønsteret i stedet . I Go er konseptet "grensesnitt" likt det som brukes i Java : ethvert objekt ( verdi ) som tilfredsstiller kontrakten spesifisert av et grensesnitt (uten behov for en eksplisitt erklæring) får den typen. Det finnes også måter å bygge inn strukturer i andre strukturer for å få noe som ligner på underklasser . Go - metoder er mer generelle enn C++- eller Java-metoder, og er inkludert i strukturer ved å deklarere funksjoner knyttet til dem. De kan defineres for alle typer data; ikke bare for poster . På den annen side er Go-grensesnitt, i motsetning til språk som Java, implisitt skrevet, det vil si at grensesnittet anses å ha blitt implementert når en struktur implementerer metodene selv når dette ikke er spesifisert.
Det klassiske Hello World- programmet i Go ligner på hvordan det ville blitt gjort i C++. Med dette typiske eksemplet kan vi se at når det gjelder syntaks, er de veldig like:
hovedpakke _ importer "fmt" func main () { fmt . Println ( "Hei, verden." ) }Kommentarnotasjonen er nøyaktig den samme som i C++
/* ... ... ... */ // ...Et program for en webapplikasjon.
importere ( "fmt" "Logg" "net/http" ) func helloFunc ( w http . ResponseWriter , r * http . Request ) { fmt . Fprintf ( w , "Hei verden!" ) } func main () { http . HandleFunc ( "/" , helloFunc ) logg . Fatal ( http .ListenAndServe ( " :8080" , null )) }