Go (ohjelmointikieli)

Go (usein muodossa Golang) on Googlen kehittämä ja marraskuussa 2009 julkistettu ohjelmointikieli.Google-go-language Kieltä ovat olleet kehittämässä muun muassa Rob Pike ja Ken Thompson. Se on julkaistu BSD-lisenssillä.
Go-kielen taustalla on Rob Piken ja muiden, pääasiassa Bellin laboratorioista Googlelle siirtyneiden Go-tiimin jäsenten pitkäaikainen tyytymättömyys moderniin kieli- ja käyttöjärjestelmäympäristöönhttp://herpolhode.com/rob/utah2000.pdf.

 Tausta 

Olioparadigma Simula-ohjelmointikielestä periytyvine luokkahierarkioineen ei koskaan miellyttänyt Pikea. Hän ei uskonut väitteisiin, joiden mukaan käännettävät ja staattisesti tyypitetyt kielet ovat kankeita ja siksi tarvitaan dynaamista tyypitystä ja skriptikieliä.

Lisäksi Pike on aina ollut sitä mieltä, että CSP-malliin perustuva rinnakkaislaskenta on paras, joskaan ei ainoa tapa strukturoida modernia prosessi- ja tietoliikenneympäristöä (ja monia muita asioita) algoritmeiksi. Samalla se mahdollistaa moniprosessori- ja moniydinkoneiden tehokkaan hyödyntämisen.

Go on harkittu ortogonaalisuuteen ja säännöllisyyteen pyrkivä kokonaisuus, jossa jokaisella kielen ja kirjastojen ominaisuudella on perusteet joiden on tarkoitus tukea toisiaan ilman päällekkäisiä tai turhia ominaisuuksia.

 Ominaisuudet 
pienoiskuva|Go-ohjelmointikielen maskotti, taskurotta.

Go-kielen tärkeimpiä ominaisuuksia ovat:

 interface-käsitteeseen ja tyyppien laajentamiseen ("type embedding") perustuva, kevyt ja joustava "olioparadigma", joka osin tulee Robert Griesemerin (ETH:n ja "Wirthin koulukunnan" miehiä) kautta. Tämä on jokseenkin uniikki lähestymistapa "valtavirran" kielissä.
 nopea kääntäminen, joka tekee ohjelmankehityksestä yhtä joustavaa kuin tulkkiympäristöissä. 
 staattinen, turvallinen tyypitys, jossa kääntäjä kuitenkin usein johtaa tyypit implisiittisesti, jolloin ohjelmoijan ei tarvitse erikseen määritellä tyyppejä.
 CSP-mallin mukainen rinnakkaisuuden hallinta goroutineiden avualla, sekä tiedon hallinta eri goroutineiden välillä kanavien (eng. channel) avulla.

Lisäksi Go-kieleen on kerätty monta pienempää ideaa Piken, Thompsonin, Griesemerin ja nuoremman Russ Coxin kokemusten perusteella. Ominaisuudet ovat tuttuja muista ohjelmointikielistä ja niihin kuuluvat muiden muassa:

 Reflektio
 Anonyymit funktiot, sulkeumat ("closure") ja muita funktionaalisen ohjelmoinnin ideoita
 Automaattinen roskienkeräys ("garbage collection") käännetyssä kielessä
 Kevyt "integroitu" käännös-, ajo-, testi-, dokumentaatio ja pakettihallinta yhdellä työkalulla ("go"), joka nojaa osin tiettyihin koodaus- ja dokumentointikonventioihin
 Kevyt näkökulma tyyppiparametrinen geneerisyyteen. Alunperin tekijöiden mukaan pelkkä interface-käsite oli riittävä. Käyttäjien palautteen vuoksi geneerisyys lisättiin versiossa 1.18.

Go-projektilla on kattava standardikirjasto, joka sisältää esim. välineet moderniin verkko-ohjelmointiin HTTP/HTML/JSON/XML-ympäristössä. Koska standardikirjasto ei määrittele graafista käyttöliittymää, Go-ohjelmat on usein rakennettu tässä kirjastossa toteutetun Web-palvelimen avulla. CGO-lisäosan avulla voi kutsua erillisiä C-kielisiä kirjastoja.

Go-kielen sisältämien ominaisuuksien lisäksi onkin lähes yhtä oleellista ne asiat, jotka siitä on tietoisesti jätetty pois. Esimerkiksi Go ei sisällä poikkeuksia tavanomaisessa muodossa, vaan virhetilanteiden havaitseminen ja korjaaminen on toteutettu eri tavalla. Go käyttää panic- ja recover-avainsanoja ja/tai funktioiden palauttamia virhekoodeja.

 Hello World 
Yksinkertainen esimerkki "hello.go":
package main

import "fmt"

func main() {
	fmt.Println("Hello, 世界")
}

Jokainen Go-ohjelma kuuluu johonkin pakettiin (esimerkissä main). Ohjelmaan tuodaan paketti fmt, joka sisältää standarditulostukseen tarvittavan toiminnon. Ohjelman suoritus alkaa main()-funktiosta. Ohjelma käyttää fmt.Println()-metodia rivin esittämiseen. Huomaa, että Go-kääntäjä vaatii lohkon aloittavan aaltosulun rivin loppuun (esimerkiksi, samalle riville func-avainsanan kanssa), ei omalle rivilleen.

Ohjelma suoritetaan komentoriviltä:
go run hello.go
Esimerkissä hello.go on lähdekooditiedoston nimi.

 Ohjelmien kääntäminen 
Käännetty ohjelma tehdään komennolla go build.https://golang.org/cmd/go/#hdr-Compile_packages_and_dependencies

Kääntäjä tukee UTF-8-muotoista lähdekoodia, kuten koko standardiympäristö ja syötteen käsittely. UTF-8 on sallittu tunnusten nimissä. Go käyttää yleensä staattista linkitystä, jolloin sovelluksen voi asentaa käyttöön yhtenä binaaritiedostona ilman ulkoisia riippuvuuksia.

 Lähteet 

Aiheesta muualla
 Go-ohjelmointikielen kotisivu
 Hyvä tapa seurata Go-uutisia on tunniste #golang X:ssä
 Golang-nuts keskusteluryhmä
 IRC-kanava #go-nuts, irc.libera.chat
 The Go Programming Language Redditissä
 Go-aiheinen Slack

Luokka:Google
Luokka:Ohjelmointikielet
Luokka:Vuoden 2009 ohjelmistot
Luokka:2000-vuosikymmenen ohjelmointikielet