A Go
- imperatív,
- általános célú,
- magas szintű,
- erősen típusos,
- szemétgyűjtést alkalmazó
programozási nyelv.
Fejlesztői szerint a Go egy
- egyszerű
- gyors (fordítási ill. futási sebesség)
- biztonságos (típus-, memóriabiztonság)
- párhuzamos (gorutinok mély nyelvi támogatása)
- élvezetes (egyszerű szintaxis, szemétgyűjtés)
- nyílt forráskódú (bárki által használható)
programozási nyelv.
A nyelv fejlesztése a Google berkein belül indult. A fejlesztés célja egy olyan nyelv kifejlesztése volt, mely megfelel a 2010-es évek kihívásainak. A fejlesztők észrevették, hogy (széles körben elterjedt) rendszerprogramozásra szánt nyelv már évtizedek óta nem készült, és amik akkor készültek (C, esetleg C++), már elavultak (nem párhuzamos rendszerekre tervezték őket), illetve néhány olyan tervezési hibát tartalmaznak, amit csak új nyelv készítésével lehet megoldani (pl. include fájlok seregének problémája).
Legutolsó hivatalos verziója, az 1.2 2013. december 1-jén jelent meg. Idővel elválik, hogy a nyelv egy sikertörténet lesz-e, vagy csak egy újabb programnyelv a rengeteg között.
Verziók
A Go kiadásai az alábbiakat foglalják magukban: nyelv specifikáció, a nyelv legfontosabb programkönyvtárainak specifikációja ("core API"), és egz kiadás tartalmazza ezek implementációját két fordító csomag (gc és gccgo) formájában. A fejlesztők igérete szerint az 1.x[.y] verzió alatt írt programok forráskódja (binárisan nem!) kompatibilis marad minden későbbi 1.x[.y] verzióval, de a fejlesztés későbbi szakaszában megjelenhet a Go 2, amire ez nem feltétlenül áll fenn.
1.2
Megjelenés ideje: 2013. december 1.
Fontosabb változások:
- A 3 indexű szeletek definiálhatóságával bővül a szintaxis. A korábbi
array[2:4]
szelet kifejezés mellett használható az alábbi forma is: array[2:4:7], ahol a harmadik index-el a szelet alatti adatszerkezet maximális kapacitását tudjuk korlátozni, ezzel közvetetten a szelet kapacitását is. Részletesebb példa a Szelet kifejezések tárgyalásánál.
- Biztonságosabb lett a nil pointer használat. Példaként az alábbi esetben az inicializálatlan x változó értéke nil, ennek ellenére az x.Field kifejezéssel elérhető volt az 1<<24-el leírt memóriacím. Az ilyen jellegű nil pointeren keresztüli indirekt hivatkozások a továbbiakban futási idejű panic-ot váltanak ki.
type T struct {
X [1<<24]byte
Field int32
}
func main() {
var x *T
...
}
- Beállíthatóvá vált a program számára maximálisan használható szálak száma (alapértelmezetten 10000), ezzel elkerülendő bizonyos körülmények között előforduló kiéheztetési problémákat. A változtatás közvetlenül nem befolyásolja a gouroutine-ok számát azok megvalósításából adódóan.
- Implementációs változások a futásidejű verem területén. A minimális veremméret 4KB-ról 8KB-ra növekedett. Ennek a változásnak az oka, hogy számos program esetén költséges veremszegmens váltásokat okozott teljesítménykritikus kódszakaszokban. A változtatás következménye az is, hogy a nagyobb verem méretet kihasználó programok memóriahasználata megnövekedett, de a tervek között szerepel új veremkezelő technológia bevezetése, melynek célja ennek is a megoldása.
- A godoc és a vet átkerült a go.tools subrepository-ba, valamint a
go doc
alparancs megszűnt, ezután külön godoc
parancsként használható, amennyiben telepítettük a csomagot:
$ go get code.google.com/p/go.tools/cmd/godoc
$ go get code.google.com/p/go.tools/cmd/vet
- A gccgo 1.2-es változata várhatóan a GCC csomag 4.9-es verziójának lesz része, a jelenlegi GCC 4.8.2-ben a gccgo 1.1.2-es verziója szerepel.
- A
go test
alparancs -cover
kapcsolóval képes a teszt lefedettség kimutatására, amennyiben telepítve van a cover tool:
$ go get code.google.com/p/go.tools/cmd/cover
- Számos változtatás a beépített programkönyvtárakban.
1.1
Megjelenés ideje: 2013. május 13.
Fontosabb változások:
- A nullával való osztás innentől futási idejű panic helyett fordítási idejű hibát okoz.
- Objektummetódus, mint érték bevezetése. Egy függvény típusú változónak értékül adható egy konkrét objektum egy metódusa, melyet ha később meghívunk, akkor az mindig ugyanazon objektumpéldányon fog lefutni: pl.
f := lista.Max
ahol a list egy List tipusu ertek, melyte letezik egy Max metodus. Részletesebb példa a Metóduskifejezések tárgyalásánál.
- Gyengítették a korábbi feltételt miszerint a szignatúrájában visszatérési értéket definiáló függvények végén kötelezően szerepelnie kell return vagy panic kifejezésnek, ezentúl ha szintaxis alapján kikövetkeztethető a terminálási kifejezés, akkor nem szükséges megadni azokat. Például függvénytörzsben egy elágazás mindkét ágában szerepel return, akkor a függvény végén nem kell kötelezően szerepelnie.
- Az int és uint típusok mérete 64 bit-re változott, mind a gc és gccgo implementációban 64 bites platformok esetén. A nyelv specifikációja az implementációra bízza a választást 32 és 64 bites ábrázolás között, korábban egységesen 32 bit volt mindkét fordító és minden platform esetén.
- Kísérleti jellegű támogatás bevezetése a következő platformokhoz: freebsd/arm, netbsd/386, netbsd/amd64, netbsd/arm, openbsd/386 and openbsd/amd64
- A Go 1.1-el fordított programok performanciája kb. 30%-40%-al javult 1.0-hoz képest a mérések alapján.
- Az eszközkészlet a race detector-ral bővült, mely segítségével konkurens programok futási idejében a versenyhelyzetekből származó hibákat lehet detektálni (speciálisan felkészített bináris esetén).
- Számos változtatás az eszközkészletben és a beépített programkönyvtárakban.
1.0
A nyelv első hivatalosan támogatott változata (a Go 1.0) 2012. március 28-án jelent meg (a bejelentés a Go blogon). A hivatalos támogatás lehetővé teheti, hogy a Go valóban elterjedjen a szoftveriparban.