Gå | ||
![]() | ||
Dato for første versjon | 10. november 2009 | |
---|---|---|
Paradigme | Kompilert språk , samtidig , tvingende og strukturert programmering | |
Forfatter |
Robert Griesemer (i) Rob Pike Ken Thompson |
|
Siste versjon | 1.16.5 (3. juni 2021) | |
Utviklingsversjon | 1,16 beta1 (17. desember 2020) | |
Skrive | Sterk , statisk , strukturell | |
Påvirket av |
C Python Oberon-2 ( en ) Limbo Active Oberon ( en ) Kommuniserer sekvensielle prosesser Pascal Oberon Smalltalk Newsqueak ( en ) Modula-2 Alef APL BCPL Modula ( en ) Occam |
|
Operativsystem | Windows , GNU / Linux , Mac OS X , FreeBSD , OpenBSD , DragonflyBSD , Solaris , Plan 9 | |
Tillatelse | BSD-lisens , patentert | |
Nettsted | golang.org | |
Filutvidelse | gå | |
Go er et samlet og samtidig programmeringsspråk inspirert av C og Pascal . Dette språket ble utviklet av Google fra et innledende konsept av Robert Griesemer , Rob Pike og Ken Thompson . Go har to implementeringer: den første bruker gc , Go- kompilatoren ; den andre bruker gccgo , “ frontend ” GCC skrevet i C ++ . Go er skrevet i C ved hjelp av yacc og GNU Bison for å analysere til versjon 1.4, og i Go selv for påfølgende versjoner (1.5).
Et Go-mål er gitt av Rob Pike, en av de tre skaperne, som sier om uerfarne utviklere:
“De kan ikke forstå strålende språk, men vi ønsker å få dem til å lage gode programmer. Dermed må språket vi gir dem være lett å forstå og lett å ta i bruk ”
Go ønsker å legge til rette for og akselerere storstilt programmering: på grunn av sin enkelhet er det derfor tenkelig å bruke den også til å skrive applikasjoner, manus eller store systemer. Denne enkelheten er også nødvendig for å sikre vedlikehold og utvikling av programmer over flere generasjoner av utviklere.
Selv om det også er målrettet mot utførelseshastighet, viktig for systemprogrammering, anser det multitrading som det mest robuste middel for å sikre denne hastigheten på nåværende prosessorer, samtidig som det er enkelt å vedlikeholde ved å skille enkle oppgaver utført uavhengig for å unngå å lage "gassfabrikker". Denne designen muliggjør også skrivefri drift på flerkjernede arkitekturer ved å umiddelbart utnytte den tilsvarende kraftøkningen.
Her er et eksempel på et typisk Hello-verdensprogram skrevet i Go:
package main import "fmt" func main() { fmt.Printf("Hello, world\n") }Go-språket ble opprettet for systemprogrammering og har siden blitt utvidet til applikasjoner, som er det samme målet som C og spesielt C ++. Det er et tvingende og konkurrerende språk . Kompileringshastigheten (på grunn av enkelheten til syntaksen) gjør at den noen ganger brukes som skriptspråk.
Go integrerer direkte, som Java , samtidig kodebehandling. Nøkkelordet golar en funksjonsanrop kjøre i konkurranse med den nåværende goroutinen . En goroutine , så navngitt av fjern analogi med coroutines , er en gjennomføringstråd overvåket av planleggeren som er inkludert i kjøretiden. Programmet vil da dra nytte av topologien til datamaskinen for å utføre goroutinene best, ikke nødvendigvis i en ny tråd, men det er også mulig at en gruppe goroutines blir multipleksert på en gruppe tråder.
For å kalle en funksjon f , skriver vi f () . For å kalle det som en goroutine, skriver vi ganske enkelt go f () , som er veldig lik kall f- oppgaven; av PL / I , et språk som også administrerer multitasking siden 1970.
Goroutines kommuniserer med hverandre ved å sende meldinger , sende eller motta meldinger over kanaler.
Disse meldingene synkroniserer goroutinene med hverandre i samsvar med CSP- modellen , som forfatterne anser for å være mer intuitive enn modellen med flere tråder (med synkronisering av semaforer som inneholder låser, en forestilling også introdusert av Dijkstra ).
I dagens språkstand (2018)
Språket inneholder aspekter av Pascal og C, men vi utsetter oss for mange feil hvis vi øyeblikkelig glemmer at vi verken er i Pascal eller i C. Så a:=btildel en variabel a ved å tildele den verdien og typen b, men hvis variabelen er allerede tildelt, du må bare skrive a=b. Ikke forveksles med a==b(likestilling av verdier). Uttrykket bak a iftrenger ikke parenteser, men uttrykket som skal utføres hvis testen består må være omsluttet av parentes. I sin nåværende tilstand tolererer ikke kompilatoren at en erklært variabel ikke brukes, noe som absolutt oppmuntrer til god praksis, men som gjør prøving og feiling til feilsøking av programmer veldig smertefullt.
Go kjenner skalartyper (heltall inteller int64, flyter float, strenger string), matriser indeksert av heltall fra 0, kart som er samlinger av objekter indeksert av nøkler (kalt ordbøker , hashes eller assosiative matriser på andre språk) og skiver som er en dynamisk generalisering av arrays.
Den har lett tilgang til lese- og skrivefiler, enten i linje- eller tegnmodus, eller ved å absorbere hele filen gjennom os- og io- pakkene .
Go har et system av statisk type , sterkt skrevet , strukturelt og trygt , basert på typen slutning med muligheten for å bruke en eksplisitt skriving.
For å gi et eksempel er skriving s := "Camélia", som erklærer, tildeler og initialiserer s, mulig og ikke tvinger skriving var s string = "Camélia", som imidlertid forblir akseptert.
Kompatibilitet med sammensatt type er basert på egenskaper i stedet for navn. Det vil si at to sammensatte typer vil være ekvivalente hvis egenskapene deres er ekvivalente: samme navn for eiendommen og typeekvivalens. Dette er strukturell typing .
Dette har som konsekvens at språket ikke er objekt i klassisk forstand (verken med klasser eller med prototype ), men designerne av språket har tatt et mer originalt valg for et statisk språk. Det er mulig å definere grensesnitt som bærer metoder som beskriver oppførselen til et objekt (det er også enkelt å blande flere grensesnitt i ett). Go-funksjoner kan erklære at de godtar et argument fra dette grensesnittet. Et objekt som erklærer alle metodene i dette grensesnittet, med samme signatur, kan sendes som et argument for denne metoden. Typekontroll gjøres statisk av kompilatoren.
Det faktum at Go ikke er et objekt i klassisk forstand, betyr at Go ikke har noen arv og ingen underklassering. Dette gjør det mulig å omgå problemene som disse systemene gir, for eksempel flere arv på språk som tillater det (i C ++ for eksempel), eller enkel arv (i Java for eksempel). Med eiendomsbasert typeekvivalens trenger ikke Go arv. Underklassering er etterlignet av "type boarding". Dette gjør det enkelt å blande to uavhengig utformede kodebaser uten å måtte dele vanlige typer.
Synligheten til strukturer, attributter, variabler, konstanter, metoder, toppnivåtyper og funksjoner utenfor deres deklarasjonspakke er definert av tilfellet med det første tegnet i deres identifikatorer .
Go fungerer i Unicode både for kildekoden og for behandlingen av strenger. Dens litteratur forlater imidlertid de uttrykk kodepunkter for forkortelsen av runer . Prosedyrer gjør det mulig å transformere karakterrepresentasjoner til runer (hvilken som helst rune som har en fast størrelse) og transformere ved standard prosedyrer en serie Unicode-tegn til runer i en matrise (en rune per element), så vel som omvendt, uten å måtte sjonglere representasjoner med variabel lengde eller bekymring for om maskinen er liten-endian eller stor-endian . Bærbarhet er derfor sikret.
Å snakke om runer unngår uklarheter som ville være til stede med karakter eller byte . For å utforske en kjede bruker vi enten kjedefunksjoner direkte, eller så blar vi gjennom den fra rune til rune.
Kapitalisering av nasjonale tegn (for eksempel "è" ⇒ "È") gjøres ganske enkelt ved unicode.ToUpper(r rune) rune. Runene lar deg spesifisere i hvilken som helst Unicode, Thai, kinesisk, gresk karakter, inkludert APL- språk - og også hvilket som helst uttrykksikon som finnes der.
I Go håndteres minnestyring av en søppeloppsamler .
Det er ingen generell programmering ennå, selv om designerne av språket tenker på det. Det er ingen metodeoverbelastning eller pekereitmetikk . Endelig er det ingen påstander eller unntak . For å erstatte disse to, gir GB søkeord defer, panicog recoversom gir mekanismer som ligner på språket avvikshåndtering systemer som C ++ og Java (søkeord try, catch, finallyog throw).
Go kan grensesnitt med C / C ++ - biblioteker, tredjepartsutviklere som allerede har utviklet bindinger for SDL og MySQL .
Go definerer et standard kodeformat (når det gjelder fordypninger og presentasjon av kontrollstrukturer) og gir et verktøy for å bruke det (go fmt).
Go tilbyr også et kodebasert dokumentasjonssystem og testrammeverk.
Kompilasjonsenheten for go er pakken som er representert i standardimplementeringen av en katalog og filene som er direkte inneholdt i den katalogen.
Importen av en pakke gjøres via importbanen og kan spesifisere enten et standardbibliotek, eller også tredjepartspakker installert i eksterne kildelager (støttes for øyeblikket: repository under svn , git , mercurial og basar ).
Selv om Go i utgangspunktet er ment å produsere robuste systemapplikasjoner og ikke brukerprogrammer, utvikles lenker til OpenGL på eksperimentell basis.
I likhet med C krever Go at du oppgir hvilke biblioteker du vil bruke. I motsetning til C anser den kompilering feilaktig hvis dette biblioteket ikke brukes. Go-kompilatoren inneholder faktisk ingen advarsler etter valg av designerne: "Det er ikke viktig å indikere hva det ikke ville være viktig å korrigere".
Hovedbiblioteker:
Bibliotekene er noen ganger uavhengige, noen ganger avhengige. Det er også flere måter å gjøre lignende ting på. For å lese en fil kan du for eksempel bruke ioutil.ReadAll , file.Read () eller bufio.NewScanner () .
Vi får listen over biblioteker fra kommandolinjen etter go list all.
Go tillater rekursivt anrop av programmer, som noen ganger kan gjøre dem mer lesbare, uten overdreven tap av hastighet:
package main import "fmt" import "time" var s [61]int func fib(n int) int { if n < 3 { return 1 } if s[n] != 0 { return s[n] } s[n] = fib(n-1) + fib(n-2) return s[n] } func main() { var i int t0 := time.Now() for i = 1; i <= 60; i++ { fmt.Printf("fib(%d) = %-15d\t", i, fib(i)) } println() println("Durée :", time.Since(t0).Seconds()) }Dette programmet er formatert på vanlig måte av gofmt- verktøyet med alternativene -s (forenkle koden hvis mulig) og -w (skriv den modifiserte koden på plass ). Dette verktøyet justerer dybdenivåene i programmet, noe som gjør vedlikehold lettere, spesielt hvis flere utviklere trenger å opprettholde den samme koden. Merk at den ikke justerer åpnings- og lukkestagene vertikalt, de fleste nåværende redaktører (2018) er ansvarlige for å visuelt signalisere kampene i redigeringsmodus.
Go's syntaktiske valg er ikke enstemmig. Hvis språket hevder å være forenklet i skrivingen, kritiserer noen det for å ha for innflytelsesrike og dogmatiske skjevheter i denne forbindelse ved å betegne syntaksen som forvirrende og samleren av tvilsom stivhet, og siterer blant annet:
Språk har blitt kritisert for å ha "en Ferrari-motor i en Ford T-karosseri".
På den annen side foreslår Go å forenkle syntaksen til C, med vilje holdt i C ++ for å sikre bakoverkompatibilitet, for eksempel ved å fjerne de syntaktisk unødvendige parentesene bak ifog den for, ved å foreslå en standard gjennomgang i a switch, etc. Disse endringene kan gi mer lesbare programmer.
Liste over bemerkelsesverdige gratis applikasjoner skrevet i Go: