Další informace o balíčcích
Balíčky v Go jsou podobné knihovnám nebo modulům v jiných programovacích jazycích. Kód můžete zabalit a znovu ho použít někam jinam. Zdrojový kód balíčku lze distribuovat ve více souborech .go
. Zatím jsme balíček psali main
a odkazovali jsme na další nativní balíčky.
V této části se dozvíte, co je balíček. Dozvíte se také, jak ho vytvořit a jak využívat externí balíčky.
Hlavní balíček
Jak jste si možná všimli, i nejjednodušší program v Go musí být součástí balíčku. Výchozí balíček je main
obvykle balíček, který jsme zatím používali. Pokud je program součástí main
balíčku, Go vygeneruje binární soubor. Když se tento soubor spustí, zavolá main()
funkci.
Jinými slovy, když balíček použijete main
, program vytvoří samostatný spustitelný soubor. Ale pokud je program součástí jiného balíčku než main
, Go negeneruje binární soubor. Vygeneruje soubor archivu balíčku (soubor s příponou .a
).
Názvy balíčků v Go se řídí konvencí. Balíček jako název používá poslední část jeho cesty importu. Standardní knihovna Go například obsahuje balíček s názvem math/cmplx
, který poskytuje užitečný kód pro práci se složitými čísly. Cesta k importu tohoto balíčku je math/cmplx
a importujete ji takto:
import "math/cmplx"
Pokud chcete odkazovat na objekty v balíčku, použijte název balíčku, cmplx
například takto:
cmplx.Inf()
Pojďme vytvořit balíček.
Vytvoření balíčku
Vytvořte v adresáři $GOPATH/src
nový adresář s názvem calculator
. Vytvořte soubor s názvem sum.go
. Adresář stromové struktury by měl vypadat takto:
src/
calculator/
sum.go
Inicializace sum.go
souboru s názvem balíčku:
package calculator
Teď můžete začít psát funkce a proměnné balíčku. Na rozdíl od jiných programovacích jazyků Go neposkytuje public
klíčová slova, private
která označují, jestli se proměnná nebo funkce dají volat zvenčí nebo uvnitř balíčku. Go se ale řídí dvěma jednoduchými pravidly:
- Pokud chcete, aby něco bylo soukromé, začněte jeho název malým písmenem.
- Pokud chcete, aby něco bylo veřejné, začněte jeho název velkým písmenem.
Pojďme tedy do balíčku kalkulačky, který vytváříme, přidat následující kód:
package calculator
var logMessage = "[LOG]"
// Version of the calculator
var Version = "1.0"
func internalSum(number int) int {
return number - 1
}
// Sum two integer numbers
func Sum(number1, number2 int) int {
return number1 + number2
}
Pojďme se podívat na několik věcí v kódu:
- Proměnnou
logMessage
lze volat pouze z balíčku. - Proměnná
Version
je přístupná odkudkoli. Doporučujeme přidat komentář k popisu účelu této proměnné. (Tento popis je užitečný pro každého, kdo balíček používá.) - Funkci
internalSum
lze volat pouze z balíčku. - Funkce
Sum
je přístupná odkudkoli. Doporučujeme, abyste přidali komentář k popisu účelu funkce.
Pokud chcete ověřit, že všechno funguje, můžete příkaz spustit go build
v calculator
adresáři. Pokud ano, všimněte si, že se negeneruje žádný spustitelný binární soubor.
Vytvoření modulu
Funkce kalkulačky jste umístili do balíčku. Teď je čas tento balíček umístit do modulu. Moduly Go obvykle obsahují balíčky, které nabízejí související funkce. Modul balíčku také určuje kontext, který Go potřebuje ke spuštění kódu, který jste seskupili. Tyto kontextové informace zahrnují verzi Jazyka Go, pro které je váš kód napsaný.
Moduly také pomáhají ostatním vývojářům odkazovat na konkrétní verze kódu a usnadňují práci se závislostmi. Další výhodou je, že zdrojový kód našeho programu nemusí v adresáři existovat výhradně $GOPATH/src
. Když toto omezení uvolníte, bude pohodlnější pracovat s různými verzemi balíčků v jiných projektech najednou.
Pokud tedy chcete pro balíček vytvořit modul calculator
, spusťte tento příkaz v kořenovém adresáři ($GOPATH/src/calculator
):
go mod init github.com/myuser/calculator
Po spuštění tohoto příkazu github.com/myuser/calculator
se změní na název modulu. Tento název použijete k odkaz na tento název v jiných programech. Příkaz také vytvoří nový soubor s názvem go.mod
. Adresář stromové struktury teď vypadá takto:
src/
calculator/
go.mod
sum.go
Obsah go.mod
souboru by měl vypadat jako následující kód. (Verze Go se může lišit.)
module github.com/myuser/calculator
go 1.14
Pokud chcete na balíček odkazovat calculator
v jiných programech, musíte ho importovat pomocí názvu modulu. V tomto případě je github.com/myuser/calculator
název . Teď se podíváme na příklad použití tohoto balíčku.
Poznámka:
Správa závislostí v Go v minulosti nebyla snadná. Systém správy závislostí stále probíhá. Pokud se chcete dozvědět více o modulech, podívejte se na tuto řadu příspěvků publikovaných na blogu Go.
Odkaz na místní balíček (modul)
Teď balíček použijeme. Budeme pokračovat v ukázkové aplikaci, která používáme. Tentokrát místo sum
funkce v main
balíčku použijeme ten, který jsme vytvořili dříve v calculator
balíčku.
Struktura souborů stromové struktury by teď měla vypadat takto:
src/
calculator/
go.mod
sum.go
helloworld/
main.go
Tento kód použijeme pro $GOPATH/src/helloworld/main.go
soubor:
package main
import (
"fmt"
"github.com/myuser/calculator"
)
func main() {
total := calculator.Sum(3, 5)
fmt.Println(total)
fmt.Println("Version: ", calculator.Version)
}
Všimněte si, že příkaz importu používá název balíčku, který jste vytvořili: calculator
. Chcete-li volat Sum
funkci z daného balíčku, musíte zahrnout název balíčku, jako v calculator.Sum
. Nakonec máte také přístup k Version
proměnné. Říkáte tomu takto: calculator.Version
.
Pokud se teď pokusíte program spustit, nebude fungovat. Musíte říct Go, že používáte moduly k odkazování na jiné balíčky. Uděláte to tak, že v adresáři $GOPATH/src/helloworld
spustíte tento příkaz:
go mod init helloworld
V předchozím příkazu helloworld
je název projektu. Tento příkaz vytvoří nový go.mod
soubor, takže teď adresář stromové struktury vypadá takto:
src/
calculator/
go.mod
sum.go
helloworld/
go.mod
main.go
Když soubor otevřete go.mod
, měli byste vidět něco jako následující kód. (Verze Go se může lišit.)
module helloworld
go 1.14
Vzhledem k tomu, že odkazujete na místní kopii modulu, musíte informovat Go, že nechcete používat vzdálené umístění. Proto musíte soubor ručně upravit go.mod
tak, aby zahrnoval odkaz, například takto:
module helloworld
go 1.14
require github.com/myuser/calculator v0.0.0
replace github.com/myuser/calculator => ../calculator
Klíčové replace
slovo určuje použití místního adresáře místo vzdáleného umístění modulu. V tomto případě, protože a helloworld
calculator
programy jsou v $GOPATH/src
, umístění je jednoduše ../calculator
. Pokud je zdroj modulu v jiném umístění, definujete zde místní cestu.
Spusťte program pomocí tohoto příkazu:
go run main.go
Výstup by měl vypadat takto:
8
Version: 1.0
Výzva 1
Co se stane, když se pokusíte volat logMessage
proměnnou nebo internalSum
funkci z calculator
balíčku v hlavní aplikaci? Běží? Vyzkoušejte to!
Řešení výzvy:
package main import ( "fmt" "github.com/myuser/calculator" ) func main() { total := calculator.internalSum(5) fmt.Println(total) fmt.Println("Version: ", calculator.logMessage) }
Publikování balíčku
Publikování balíčku Go je poměrně snadné. Stačí, aby byl zdrojový kód balíčku veřejně dostupný. Většina vývojářů používá GitHub k zpřístupnění balíčků veřejnosti, což je důvod, proč někdy najdete odkazy na github.com
příkazy importu.
Pokud například chcete balíček publikovat calculator
do účtu GitHubu, musíte vytvořit úložiště s názvem calculator
. Adresa URL by měla vypadat nějak takto:
https://github.com/myuser/calculator
Balíčky budete mít ve verzi označováním úložiště, například takto:
git tag v0.1.0
git push origin v0.1.0
Vývojáři, kteří chtějí použít váš balíček (včetně vás), by na něj mohli odkazovat takto:
import "github.com/myuser/calculator"
Pojďme se podrobněji seznámit s odkazem na balíčky třetích stran.
Odkaz na externí balíčky (třetích stran)
Někdy vaše programy potřebují odkazovat na balíčky napsané jinými vývojáři. Tyto balíčky jsou obvykle dostupné na GitHubu. Následující pokyny pro odkazování na balíčky třetích stran fungují bez ohledu na to, jestli vyvíjíte balíček (jiný balíček než main
) nebo samostatný program ( main
balíček).
Pojďme přidat odkaz na rsc.io/quote
balíček:
package main
import (
"fmt"
"github.com/myuser/calculator"
"rsc.io/quote"
)
func main() {
total := calculator.Sum(3, 5)
fmt.Println(total)
fmt.Println("Version: ", calculator.Version)
fmt.Println(quote.Hello())
}
Pokud používáte Visual Studio Code, go.mod
soubor se při uložení souboru aktualizuje. Teď vypadá takto:
module helloworld
go 1.14
require (
github.com/myuser/calculator v0.0.0
rsc.io/quote v1.5.2
)
replace github.com/myuser/calculator => ../calculator
Všimněte si, jak rsc.io/quote
odkazuje na konkrétní verzi balíčku. Pokud potřebujete upgradovat závislosti programu, budete muset změnit verzi zde.
Spusťte program znovu pomocí tohoto příkazu:
go run main.go
Výstup by měl vypadat takto:
8
Version: 1.0
Hello, world.
Všechny budoucí odkazy na balíčky třetích stran budou muset být v go.mod
souboru. Když aplikaci spustíte nebo zkompilujete, Go stáhne všechny její závislosti.