Globálne packages
Na rozdiel napríklad od Javy, je v Golangu názov package naozaj cestou kde ho nájdete na internete. Napríklad package github.com/olekukonko/tablewriter zapíšte ako
import "github.com/olekukonko/tablewriter"
V Jave sa používa podobný princíp pri definovaní názvov, ale jedná sa len o konvenciu. V Go ma hlbší význam. Takto definovaný package si nainštalujte jednoduchým príkazom
go get github.com/olekukonko/tablewriter
Alebo môžete dať iba go get a nainštalujete si všetky knižnice použité v projekte. Takto môžete organizovať aj zdrojové kódy v rámci organizácie.
Celé toto riešenie do veľkej miery nahradí potrebu Mavenu v Go.
Duplicitný názov package
Autori Go odporúčajú aby názov package bol čo najvhodnejší. A to aj v situácii, že by ste mali v projekte rovnaké názvy. Aj priamo v systémových knižniciach sú napríklad dva packages s názvami rand. Go má jednoduchý spôsob ako to používať.
package main
import (
r "crypto/rand"
"fmt"
"math/big"
"math/rand"
)
func main() {
fmt.Println(rand.Intn(1000))
max := *big.NewInt(1000)
n, _ := r.Int(r.Reader, &max)
fmt.Println(n)
}
Zacyklený import
Jazyk Go núti programátorov programovať čisto. Jedná z vecí je, že ak v package A importujete package B, v package B importujete package C, v package C importujete package D tak v package D sa vám nepodarí naimportovať package A.
To je vec, kvôli ktorej musíte v Jave použiť Maven a aj tak to riešenie nie je tak dôsledné ako v Go.
Toto je podľa mňa tá najúžasnejšia vlastnosť na celom Go pri práci na väčších projektoch. Musíte si celú aplikáciu poctivo rozdeliť na nezávislé moduly a ste vlastne donútení pracovať tak ako sa má.
Zbytočný import
Tento program je v poriadku:
package main
import (
"fmt"
"math/rand"
)
func main() {
fmt.Println("Náhodné číslo")
fmt.Println(rand.Intn(1000))
}
A tento ani neskompilujete:
package main
import (
"fmt"
"math/rand"
)
func main() {
fmt.Println("Náhodné číslo")
//fmt.Println(rand.Intn(1000))
}
Chyba: - imported and not used: "math/rand"