Jak se říká, žádný člověk není ostrov, tak ani žádný program není ostrov. Programy závisí na knihovnách jazyka a na dalších knihovnách. Go řeší tedy dva problémy. Jak závislost získat a jak závislost použít.
Aby mohlo Go závislost získat, musí vědět, kde se závislost nachází. A k tomu slouží právě posledně zmiňované jméno package. Pokud máme např. package github.com/stretchr/testify
, tak je naprosto zřejmé, že ji můžeme stáhnout z githubu. Go nám v tom ale rádo pomůže. Stačí jen říct go get github.com/stretchr/testify
a závislost je v našem GOPATH
.
Jakmile tedy máme všechny závislosti na GOPATH
, tak můžeme v klidu onu závislost použít. Např. takto
package main
import "./dalsi_package"
import nadrazena "../"
import "testing"
import "github.com/stretchr/testify/assert"
func TestNěco(t *testing.T) {
...
}
V předchozím příkladu jsme to trochu přehnali, ale zase je zde vidět jak
- referencujeme podřízenou package
dalsi_package
. Pokud by soubor byl v package$GOPATH/src/github.com/lojza/prvni_projekt
tak bychom tato package byla v$GOPATH/src/github.com/lojza/prvni_projekt/dalsi_package
- referencujeme nadřízenou package
../
. Ta by byla v$GOPATH/src/github.com/lojza/
. V našem souboru ji ovšem budeme používat jakonadrazena
. Tedy např.nadrazena.NejakaFunkce()
- Dále pak odkazujeme na package z SDK.
- Na závěr pak použijeme externí referenci. Tu si ovšem musíme nejdřív obstarat pomocí
go get
.
Pokud přicházíte na Go z Javy tak budeme mít z počátku tendenci vytvářet mnoho packagí. V Go se to tak běžně nedělá. I relativně velké programy mají jen několik packagí.
Každý zdroják v Go musí začínat určením package. Podle konvence to je buď poslední část za lomítkem (v našem případě tedy prvni_projekt
, nebo pokud se jedná o spustitelný program, tak to bude main
. V jedné package (adresáři) musí všechny zdrojáky uvádět jedno jméno package!
A jako bonus viditelnost. Go jako takové nemá zapouzdření jak jej známe z objektových jazyků, ale používá jednoduchou konvenci pro “viditelnosti”. Vše co začíná malými písmeny je viditelné pouze v dané packagi. A naopak vše začínající velkými písmeny je vidět i vně package. Tedy
package "subpackage"
func neviditelnáFunkce() {}
func ViditelnáFunkce(){}
var neviditelnáProměnná string
var ViditelnáProměnná string
type ViditelnáStruktura struct {
neviditelnéPole string
ViditelnéPole string
}