A go parancs célja a Go forráskódok széleskörű igényeket kielégítő kezelése, a fejlesztést segítő eszközök integrálása. A működéséhez egy jól definiált munkakönyvtár struktúra szükséges, a fejlesztőkörnyezet viselkedését környezeti változók révén tudjuk konfigurálni. A legfontosabb környezeti változók az alábbiak:
$GOROOT
magára a Go fordítóra és a hozzá tartozó eszközökre, beépített könyvtárakra vonatkozó könyvtár, struktúrájukat tekintve egyébként megegyeznek, viszont erősen ajánlott elkülöníteni őket.
Így néz ki a struktúra egy példacsomaggal(forrás): bin
csak akkor van jelen a struktúrában, hogyha a $GOBIN nem rendelkezik másképp, a parancs típusú forrásfájlokhoz (melyeknél csomagnévnek main-t adtunk meg) tartozó binárisok ide kerülnek a go install
parancs használatakor az őket befoglaló könyvtár nevén (a példában quux), hacsak nem adtunk meg mást a $GOBIN környezeti változóban.pkg
-be pedig csomag típusú forrásokhoz tartozó binárisok (tárgykódok) kerülnek go install
hatására, célplatformonként csoportosítva a kényelmesebb crosscompiling miatt, és a forráskód csomagstruktúráját követő könyvtárhierarchiában.src
pedig a saját forrásakódjainkat, vagy go get
paranccsal letöltött forráskódokat tartalmazza, melyek lefordíásával előáll a fentebbi 2 könyvtár tartalma.
$HOME/go
és az all.bash valamint, a fejlesztőkörnyezet forráskódja a $HOME/go/src
-ben található.
$GOOS | $GOARCH |
---|---|
darwin | 386 |
darwin | amd64 |
freebsd | 386 |
freebsd | amd64 |
freebsd | arm |
linux | 386 |
linux | amd64 |
linux | arm |
netbsd | 386 |
netbsd | amd64 |
netbsd | arm |
openbsd | 386 |
openbsd | amd64 |
plan9 | 386 |
plan9 | amd64 |
windows | 386 |
windows | amd64 |
go install
parancs által telepített futtatható binárisok. Ha nem definiáljuk, akkor az értéke $GOROOT/bin
GO386=387
: x87 utasítások használata, ez kompatibilis minden x86 processzorralGO386=sse2
: SSE2 utasítások használata, ez hatékonyabb, viszont csak Pentium 4/Opteron/Athlon 64 processzorokon érhető el.A Go eszközkészlete széleskörű támogatást nyújt a fejlesztőnek a szoftverfejlesztés folyamatának legfontosabb fázisaihoz, ennek a központi gyűjtőhelye a go parancs, melynek funkciói alparancsok révén érhetőek el:
Ez a parancs hívja meg a szükséges Go fordítót, melyet a $GOOS és $GOARCH alapján, vagy ezek hiányában a $GOHOSTOS, $GOHOSTARCH alapján, ha ezek sincsenek beállítva, akkor a futó operációs rendszert és annak platformját veszi alapul. A paraméterként átadott lefordítandó csomagokon túl az import
kulcsszavak feldolgozásával felépített függőségi fa csomagjait is, hogyha szükséges őket újrafordítani, a függőségek fa hierarchiája a fordító által biztosított, fordításidejű hibát kapunk, amennyiben a függőségek irányított kört tartalmaznak.
Használata:
Ha csomagok helyett forrásfájlokat adunk meg, akkor azok a fordító egy csomagba tartozó forrásfájlokként kezeli. A Go programcsomag tartalmaz számos fordító, linkelő, assembler programot a különböző architektúrákhoz egységes elnevezési konvencióval, az első karakter egy számjegy, ami az architektúrát határozza meg, a második pedig a program által ellátott fordítási funkciót, az alábbi kombinációk lehetségesek:
5a | Plan 9 assembler ARM architektúrához |
5c | Plan 9 C fordító ARM architektúrához |
5g | gc fordító ARM architektúrához |
5l | linkelő ARM architektúrához |
6a | Plan 9 assembler x86-64 architektúrához |
6c | Plan 9 C fordító x86-64 architektúrához |
6g | gc fordító x86-64 architektúrához |
6l | linkelő x86-64 architektúrához |
8a | Plan 9 assembler 32-bites x86 architektúrához |
8c | Plan 9 C fordító 32-bites x86 architektúrához |
8g | gc fordító 32-bites x86 architektúrához |
8l | linkelő 32-bites x86 architektúrához |
Használata:
Lefordítja a megadott forrásfájlokat és futtatja az így kapott binárist, melynek átadja a parancskiadáskor definiált parancssori argumentumokat. Megkötés, hogy a megadott forrásfájloknak ugyanabban a könyvtárban kell lennie és a main csomag részeként kell őket definiálni (package main
sor a fájl elejére), viszont csak az egyik tartalmazhat main() függvényt.
testing
beépített csomag nyújt támogatást a programozó számára. A tesztfájlok szokásos Go nyelven íródott forrásfájlok, ami megkülönbözeti őket az a speciális névkonvenció használata. A tesztfájloknak "_test.go" -ra végződő névvel kell rendelkezniük és a tesztelendő csomagban kell lennie, vagy ha külön csomagba szeretnénk helyezni, akkor forrásfájlban deklaráljuk a "[csomagnév]_test" részeként a tesztkódot. Egy teszt forrásfájlban háromféle függvényt vesz figyelembe a go test
:
A tesztelő függvényeknek az alábbi szignatúrával kell rendelkeznie:
Xxx
helyére tetszőleges alfanumerikus karaktersorozat helyettesíthető.
A tesztfüggvényeink paramétere egy testing.T típusú objektumra mutató pointer, ez az objektum hivított tárolni a tesztelés állapotát, ez az állapot az objektum alábbi metódusaival módosítható:
Fail(), FailNow()
: teszteset sikertelen kimenetének rögzítése, a FailNow()
esetében a tesztfüggvény futtatása azonnal befejeződik.Skip(), SkipNow()
: teszteset megjelölése kihagyottként, például, ha nem teljesül a teszt végrehajtásának előfeltétele, a SkipNow()
esetében a tesztfüggvény futtatása azonnal befejeződik.Failed(), Skipped()
: teszteset specifikus állapotának lekérdezése (igaz/hamis)Log(args ...interface{}), Logf(format string, args ...interface{})
: Naplóüzenetek rögzítése, a második változat a C-ből ismert printf() függvényhez hasonló formázott kiíratást alkalmaz.Fatal(args ...interface{}), Fatalf(format string, args ...interface{})
: Ekvivalens a Log() vagy Logf(), majd ezt követően a FailNow() metódusok meghívásávalSkip(args ...interface{}), Skipf(format string, args ...interface{})
: Ekvivalens a Log() vagy Logf(), majd ezt követően a SkipNow() metódusok meghívásávalParallel():
: Egy szignál küldése a tesztfuttató környezetnek, hogy a tesztünk párhuzamosan futtatható más tesztesetekkel (olyanokkal, melyek szintén meghívták a Parallel()
-t).Egy rövid példa, a testing.Short()
a rövidített tesztfuttatás igényét jelzi:
Egy példa kimenet a tesztfuttatásra, az alábbi rövid eredmény kiíratást a bukott tesztek részletesebb kimenete követi:
A mérések vagy idegennéven benchmark függvényeknek az alábbi szignatúrával kell rendelkeznie:
Xxx
helyére tetszőleges alfanumerikus karaktersorozat helyettesíthető.
A mérések célja, hogy a tesztelendő csomagunk egy függvényének futási idejét meghatározzuk, itt meg kell jegyezni, hogy ezt az értéket számos dolog befolyásolhatja:
testing.B
típusú objektum N
változójának értéke kell legyen. A tesztelést futtató környezet addig változtatja az N
értékét, amíg megbízható hosszúságú mérést nem tud futtatni.testing.B
típusú objetumunkon keresztül befolyásolható, a ResetTimer(), StartTimer(), StopTimer() műveletekkel kizárhatóak a mérés szempontjából érdektelen részek (például változók inicializálása).Egy példafuttatás a beépített html/template csomagra:
A példaprogramokat tartalmazó függvényeknek az alábbi szignatúrával kell rendelkeznie:
Xxx
helyére tetszőleges alfanumerikus karaktersorozat helyettesíthető.
A példaprogramok speciális tesztesetekként működnek a Go-ban, itt nincs szükség, sem lehetőség a tesztfutás állapotának módosítására, az automatikusan történik. A teszt specifikusan a standard output-ra küldött kimeneteket ellenőrzi, erre a feltételt egy "Output:" kezdetű komment formájában kell megfogalmaznunk a függvénytörzsben, az ellenőrzésnél a soreleji és sorvégi whitespace-eket nem veszi figyelembe.
Ezek a függvények a kimenet ellenőrzésén túl dokumentációs jelentőséggel is bírnak, a godoc
által generált dokumentációba is bekerülnek, így biztosítható, hogy helyesen működő programok szerepeljenek a csomagjaink dokumentációjában.
A go clean
parancs a forráskönyvtárakban található tárgykódok eltávolítására szolgál. Alapesetben a go
parancs egy ideiglenes könyvtárban helyezi el a fordítás közben létrejövő tárgykódokat, ezért ezt a parancsot főként egyéb eszközök vagy manuális go build
futtatások által hátrahagyott fájlok eltakarításához használják.
Kapcsolók:
Letölti és telepíti a megadott elérési utak által meghatározott csomagokat és azok függőségeit, az elérési utak formátuma a forrásokban használt import
kifejezésekben találhatóakkal megegyező kell, hogy megegyezzen. A Go támogat számos online forráskódtároló oldalt, melyekről a kódokat a nekik megfelelő verziókövető rendszerek segítségével szerzi meg:
Kapcsolók:
A verziók közötti API változások automatikus követésére, a források automatikus frissítésére használható ez az eszköz. Az 1.2-es verzióval elkülönült az eszköz egy másik forrástárolóba, így a használata is megváltozott go tool fix
-re, a régi forma is jelen van még az egyszerűbb használat és a kompatibilitás miatt, de részletesebb beállítások nem használhatóak vele.
Automatikus forráskód formázó eszköz, a paraméterként megadott csomagokban található forrásokat alakítja át. Ez eszköz segítséget ad az IDE-k kódformázó eszközeinek megvalósításához.
A forráskódok statikus elemzésével keres gyanús konstrukciókat a programokban. Nem minden találat jelent potenciális hibát, de segíthet a fordító által nem észlelt hibák feltárásában a beépített heurisztikák segítségével. Meghívható csomagokra, fájlokra vagy könyvtárakra. Az elvégezhető ellenőrzések részletesen a godoc code.google.com/p/go.tools/cmd/vet
parancs használatával tekinthetőek meg.
Tetszőleges csomagból a Go dokumentációs komment konvenciója alapján dokumentációt generál. Alapesetben a generált dokumentációt karakteres formában a standard output-ra írja az eszköz. A másik üzemmódja az eszköznek -http kapcsoló használatával történik, ilyenkor a godoc -http=<hosztnév>:<port>
parancs kiadásával saját webszerver indítható, mely a honlappal megegyező formátumú honlapot szolgáltat és a "Packages" menüpont alatt a $GOROOT és $GOPATH változók szerinti forráskönyvtárak csomagjainak dokumentációja jelenik meg. A dokumentáció részei a csomagokban speciálisan elnevezett példaprogramok is (lásd: Példaprogramok helyessége), melyek ilyenkor lefordításra és helyességellenőrzésre kerülnek, majd beépülnek a dokumentációba.
A Godoc megközelítése rokon a Python-os Docstring és a Java-s Javadoc-kal, viszont egyszerűbbre tervezték náluk. Godoc esetén a dokumentációs kommentek nem nyelvi elemek, mint Python esetén és nem kell olyan szintaktikai szabályokat sem követniük, mint a Javadoc esetén kell. A tervezők szerint ezek egyszerűen olyan jó kommenteknek kell, hogy legyenek, amiket a Godoc létezése nélkül is olvasni szeretnél a kódban.
A konvenció röviden: a dokumentálandó típus, csomagszintű változó/konstans, függvény, vagy épp maga a csomag elé írj egy hagyományos kommentet üres sor közbeékelése nélkül és a dokumentáció a program hierarchiájának megfelelően fog elkészülni. Példaként az fmt csomag Fprint függvényét megelőző sorok:
package <csomagnév>
sor.
A kommentek tartalmához néhány esetben különleges jelentés vagy formázás társul:
// BUG(who)
kezdetű kommentek ismert hibák leírásaként értelmeződnek és bekerülnek a csomag dokumentációjának "Bugs" záradékába is.