Mennä | ||
Ensimmäisen version päivämäärä | 10. marraskuuta 2009 | |
---|---|---|
Paradigma | Käännetty kieli , samanaikainen , välttämätön ja jäsennelty ohjelmointi | |
Kirjoittaja |
Robert Griesemer ( sis .) Rob Pike Ken Thompson |
|
Viimeinen versio | 1.16.5 (3. kesäkuuta 2021) | |
Kehitysversio | 1.16beta1 (17. joulukuuta 2020) | |
Kirjoittaminen | Vahva , staattinen , rakenteellinen | |
Vaikuttanut |
C Python Oberon-2 ( en ) Limbo Active Oberon ( en ) Peräkkäisten prosessien kommunikointi Pascal Oberon Smalltalk Newsqueak ( en ) Modula-2 Alef APL BCPL Modula ( en ) Occam |
|
Käyttöjärjestelmä | Windows , GNU / Linux , Mac OS X , FreeBSD , OpenBSD , DragonflyBSD , Solaris , Suunnitelma 9 | |
Lisenssi | BSD-lisenssi , patentoitu | |
Verkkosivusto | golang.org | |
Tiedostopääte | mennä | |
Go on käännetty ja samanaikainen ohjelmointikieli, jonka ovat innoittaneet C ja Pascal . Google on kehittänyt tämän kielen alkuperäisestä konseptista, jonka ovat kirjoittaneet Robert Griesemer , Rob Pike ja Ken Thompson . Go: lla on kaksi toteutusta: ensimmäinen käyttää gc: tä , Go- kääntäjä ; toinen käyttää gccgo , " frontend " GCC kirjoitettuna C ++ . Go on kirjoitettu C: ssä käyttäen yacc: ää ja GNU Bisonia jäsennettäessä versioon 1.4 asti, ja Go: ssa itse seuraaville versioille (1.5).
Go Go -tavoitteen antaa Rob Pike, yksi sen kolmesta luojasta, ja kertoo kokemattomista kehittäjistä:
"He eivät ymmärrä loistavaa kieltä, mutta haluamme saada heidät tekemään hyviä ohjelmia. Siksi heidän antamamme kielen on oltava helposti ymmärrettävä ja helppo omaksua ”
Go haluaa helpottaa ja nopeuttaa laajamittaista ohjelmointia: yksinkertaisuutensa vuoksi on sen vuoksi mahdollista käyttää sitä myös sovellusten, komentosarjojen tai suurten järjestelmien kirjoittamiseen. Tämä yksinkertaisuus on tarpeen myös ohjelmien ylläpidon ja kehityksen varmistamiseksi useiden kehittäjien sukupolvien ajan.
Vaikka se kohdistuu myös suoritusnopeuteen, joka on välttämätöntä järjestelmän ohjelmoinnille, se pitää monisäikeisyyttä tehokkaimpana keinona varmistaa tämä nopeus nykyisissä prosessoreissa ja samalla huolto helpottaa erottamalla itsenäisesti suoritetut yksinkertaiset tehtävät "kaasutehtaiden" luomisen välttämiseksi. Tämä malli mahdollistaa myös kirjoitusvapaan toiminnan moniydinarkkitehtuureissa hyödyntämällä välittömästi vastaavaa tehon lisäystä.
Tässä on esimerkki tyypillisestä Go- maailmaan kirjoitetusta Hello world -ohjelmasta :
package main import "fmt" func main() { fmt.Printf("Hello, world\n") }Go-kieli luotiin järjestelmän ohjelmointia varten ja sitä on sittemmin laajennettu sovelluksiin, mikä on sama kohde kuin C ja erityisesti C ++. Se on välttämätön ja kilpaileva kieli . Sen kokoamisnopeus (syntaksin yksinkertaisuuden vuoksi) tekee joskus sen käyttämään komentosarjakielenä.
Go integroi samanaikaisesti koodin käsittelyn , kuten Java . Avainsanan goavulla toimintokutsu voidaan suorittaa kilpailussa nykyisen gorutiinin kanssa . Goroutine , joten nimetty kaukana analogisesti coroutines , on suoritussäikeessä valvoo ajastimella mukana runtime. Tällöin ohjelma käyttää tietokoneen topologiaa hyödyntääkseen gorutit parhaiten, ei välttämättä uudessa säikeessä, mutta on myös mahdollista, että gorutiiniryhmä multipleksoidaan ryhmään säikeitä.
Funktion f kutsumiseksi kirjoitamme f () . Jos haluat kutsua sitä gorutiiniksi, kirjoitamme yksinkertaisesti go f () , joka on hyvin samanlainen kuin kutsu f- tehtävä; ja PL / I , kieli, joka hallinnoi myös moniajo vuodesta 1970.
Goroutines kommunikoi keskenään välittämällä viestejä , lähettämällä tai vastaanottamalla viestejä kanavien kautta.
Nämä viestit synkronoivat rutiineja keskenään CSP- mallin mukaisesti , jonka kirjoittajat pitävät intuitiivisempana kuin monisäikeinen malli (synkronointi tapahtuu lukkoja sisältävien semaforien avulla , Dijkstran esittämä käsite ).
Nykyisessä kielitilassa (2018)
Kieli sisältää Pascalin ja C: n näkökohtia, mutta altistamme itsemme paljon virheille, jos unohdamme hetkeksi, ettemme ole Pascalissa eikä C a:=b: ssä. Määritä siis muuttuja a osoittamalla sille arvo ja tyypin b, mutta jos muuttuja on jo varattu, sinun tarvitsee vain kirjoittaa a=b. Ei pidä sekoittaa a==b(arvojen tasa-arvo). Lauseke a: n takana ifei tarvitse sulkeita, mutta lauseke, joka suoritetaan testin läpäisyn yhteydessä, on suljettava aaltosulkeisiin. Nykytilassa kääntäjä ei siedä sitä, että ilmoitettua muuttujaa ei käytetä, mikä varmasti kannustaa hyviin käytäntöihin, mutta tekee kokeiluversiosta ohjelmien virheenkorjaukseen erittäin tuskallista.
Go tuntee skalaarityypit (kokonaisluvut inttai int64kelluvat float, merkkijonot string), taulukot, jotka on indeksoitu kokonaislukuilla alkaen 0: sta, kartat, jotka ovat näppäimillä indeksoituja objektien kokoelmia (kutsutaan sanakirjoiksi , hashiksi tai assosiatiivisiksi taulukoiksi muilla kielillä) ja viipaleet, jotka ovat taulukot.
Se käyttää helposti luku- ja kirjoitustiedostoja joko rivi- tai merkkitilassa tai absorboimalla koko tiedoston os- ja io- pakettien kautta .
Go: lla on staattisen tyyppinen , voimakkaasti kirjoitettu , rakenteellinen ja turvallinen järjestelmä , joka perustuu tyypin päätelmään mahdollisuudesta käyttää nimenomaista kirjoittamista.
Esimerkkinä voidaan mainita kirjoittaminen s := "Camélia", joka ilmoittaa, allokoi ja alustaa s, on mahdollista eikä pakota kirjoittamista var s string = "Camélia", mikä kuitenkin hyväksytään.
Yhdistetyyppien yhteensopivuus perustuu ominaisuuksiin eikä nimiin. Eli kaksi yhdistetyyppiä ovat samanarvoiset, jos niiden ominaisuudet ovat samanarvoiset: sama nimi ominaisuudelle ja tyypin vastaavuus. Tämä on rakenteellinen kirjoittaminen .
Tämän seurauksena kieli ei ole esine klassisessa mielessä (joko luokkien tai prototyypin kanssa ), mutta kielen suunnittelijat ovat tehneet alkuperäisemmän valinnan staattiselle kielelle. On mahdollista määritellä käyttöliittymiä kantavat menetelmät, jotka kuvaavat kohteen käyttäytymistä (on myös helppo sekoittaa useita rajapintoja yhdeksi). Go-toiminnot voivat ilmoittaa hyväksyvänsä argumentin tältä käyttöliittymältä. Objekti, joka ilmoittaa kaikki tämän rajapinnan menetelmät, samalla allekirjoituksella, voidaan välittää tämän menetelmän argumenttina. Kääntäjä suorittaa tyyppitarkistuksen staattisesti.
Se, että Go ei ole esine klassisessa mielessä, tarkoittaa, että Go: lla ei ole tyypin perintöä eikä alaluokitusta. Tämä mahdollistaa näiden järjestelmien aiheuttamien ongelmien kiertämisen, kuten moninkertaisen perimisen kielillä, jotka sallivat sen (esimerkiksi C ++ ), tai yksinkertaisen perimisen (esimerkiksi Java: ssa). Ominaisuusperusteisen tyypin vastaavuuden ollessa kyseessä Go ei tarvitse tyypin perintöä. Alaluokkaa jäljittelee "tyyppinen lennolle". Tämä helpottaa kahden itsenäisesti suunnitellun koodipohjan sekoittamista jakamatta yleisiä tyyppejä.
Rakenteiden, attribuuttien, muuttujien, vakioiden, menetelmien, ylätason tyyppien ja toimintojen näkyvyys niiden julistepaketin ulkopuolella määritetään niiden tunnisteiden ensimmäisen merkin tapaus .
Go toimii Unicodessa sekä lähdekoodin että merkkijonojen käsittelyn vuoksi. Sen kirjallisuus kuitenkin hylkää ilmaisu koodipisteiden lyhenteen riimut . Menettelytavat mahdollistavat merkkiesitysten muuntamisen runoiksi (kaikki kiinteän koon vievät runeja) ja muunnetaan tavallisilla menettelyillä sarja Unicode-merkkejä matriisien runeiksi (yksi rune per elementti) sekä päinvastaiseksi ilman taistelua. vaihtelevan pituiset esitykset tai huoli siitä, onko kone pieni endialainen vai iso endiumi . Siirrettävyys on siis taattu.
Puhutaan riimut vältetään epäselvyydet, joka olisi läsnä merkki tai tavu . Ketjun tutkimiseksi joko käytämme ketjutoimintoja suoraan tai selaamme sitä runeista runeihin.
Kansallisten merkkien isot kirjaimet (esimerkiksi "è" ⇒ "ization") tehdään yksinkertaisesti unicode.ToUpper(r rune) rune. Runojen avulla voit määrittää millä tahansa Unicode-, thai-, kiina-, kreikka- ja APL- kielellä - sekä kaikki siellä olevat hymiöt .
Go-sovelluksessa muistinhallintaa hoitaa roskien keräilijä .
Yleistä ohjelmointia ei vielä ole, vaikka kielen suunnittelijat ajattelevatkin sitä. Menetelmässä ei ole ylikuormitusta tai osoittimen aritmeettista . Lopuksi, ei ole väitteitä tai poikkeuksia . Korvata nämä kaksi, GB tarjoaa avainsanoja defer, panicja recoverjotka tarjoavat mekanismit muistuttavat kielen poikkeuskäsittelyä, kuten C ++ ja Java (avainsanat try, catch, finallyja throw).
Go voi olla yhteydessä C / C ++ -kirjastoihin, kolmansien osapuolten kehittäjiin, jotka ovat jo kehittäneet siteitä SDL: lle ja MySQL: lle .
Go määrittelee vakiokoodimuodon (sisennysten ja ohjausrakenteiden esityksen suhteen) ja tarjoaa työkalun sen käyttämiseen (go fmt).
Go tarjoaa myös koodipohjaisen dokumentointijärjestelmän ja testauskehyksen.
Go: n kokoamisyksikkö on paketti, jota tavallisessa toteutuksessa edustaa hakemisto ja suoraan hakemistoon sisältyvät tiedostot.
Paketin tuonti tapahtuu sen tuontipolun avulla, ja se voi määrittää joko vakiokirjaston tai myös etälähde-arkistoihin asennetut kolmannen osapuolen paketit (tuettu tällä hetkellä: arkisto svn : n alla , git , mercurial ja basaari ).
Vaikka Go on alun perin tarkoitettu tuottamaan vankkoja järjestelmäsovelluksia eikä käyttäjäohjelmia, linkkejä OpenGL: ään kehitetään kokeellisesti.
Kuten C, Go myös vaatii sinua ilmoittamaan, mitä kirjastoja käytät. Toisin kuin C, se pitää kääntämistä virheellisenä, jos kirjastoa ei käytetä. Go-kääntäjä ei itse asiassa sisällä suunnittelijoiden valitsemia varoitusviestejä: "Ei ole välttämätöntä ilmoittaa, mitä ei ole välttämätöntä korjata".
Tärkeimmät kirjastot:
Kirjastot ovat joskus itsenäisiä, joskus riippuvaisia. On myös useita tapoja tehdä samanlaisia asioita. Voit esimerkiksi lukea tiedostoa käyttämällä ioutil.ReadAll , file.Read () tai bufio.NewScanner () .
Saamme luettelon kirjastoista komentoriviltä go list all.
Go sallii ohjelmien rekursiivisen kutsumisen, mikä voi joskus tehdä niistä helpommin luettavampia, ilman nopeuden menetystä:
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()) }Tämä ohjelma on muotoiltu gofmt- apuohjelmalla tavalliseen tapaan vaihtoehdoilla -s (yksinkertaista koodi jos mahdollista) ja -w (kirjoita muokattu koodi paikalleen ). Tämä apuohjelma tasaa ohjelman syvyystasot, mikä helpottaa ylläpitoa varsinkin, jos useiden kehittäjien on ylläpidettävä samaa koodia. Huomaa, että se ei kohdista avaus- ja sulkutukia pystysuunnassa, sillä useimmat nykyiset toimittajat (2018) ovat vastuussa otteluiden visuaalisesta merkitsemisestä muokkaustilassa.
Go: n syntaktiset valinnat eivät ole yksimielisiä. Jos kieli väittää kirjoituksessaan olevan yksinkertaistettua, jotkut kritisoivat sitä liian vaikuttavasta ja dogmaattisesta puolueellisuudesta tässä suhteessa pitämällä sen syntaksia hämmentävänä ja kyseenalaisen jäykkyyden koostajana mainitsemalla muun muassa:
Kieliä on kritisoitu siitä, että sillä on "Ferrari-moottori Ford T -rungossa".
Toisaalta Go ehdottaa yksinkertaistaa C: n syntaksia, jota pidetään tarkoituksella C ++: ssa taaksepäin tapahtuvan yhteensopivuuden varmistamiseksi, esimerkiksi poistamalla syntaktisesti tarpeettomat sulkeet merkkien ja ifja takana for, ehdottamalla oletuksena kaatumista switchjne. Nämä muutokset voivat tarjota helpommin luettavia ohjelmia.
Luettelo merkittävistä ilmaisista sovelluksista, jotka on kirjoitettu Go: ssa: