Meer informatie over pakketten
Pakketten in Go zijn als bibliotheken of modules in andere programmeertalen. U kunt uw code verpakken en ergens anders opnieuw gebruiken. De broncode van een pakket kan worden gedistribueerd in meer dan één .go
bestand. Tot nu toe hebben we het main
pakket geschreven en hebben we enkele verwijzingen naar andere systeemeigen pakketten gemaakt.
In deze sectie leert u wat een pakket is. U leert ook hoe u er een maakt en hoe u externe pakketten gebruikt.
Hoofdpakket
Zoals u misschien al hebt opgemerkt, moet zelfs het eenvoudigste programma in Go deel uitmaken van een pakket. Meestal is het standaardpakket het main
pakket, het pakket dat we tot nu toe hebben gebruikt. Als een programma deel uitmaakt van het main
pakket, genereert Go een binair bestand. Wanneer dat bestand wordt uitgevoerd, wordt de functie aangeroepen main()
.
Met andere woorden, wanneer u het main
pakket gebruikt, produceert uw programma een zelfstandig uitvoerbaar bestand. Maar wanneer een programma deel uitmaakt van een ander pakket dan main
, genereert Go geen binair bestand. Er wordt een pakketarchiefbestand gegenereerd (een bestand met de .a
extensie).
In Go volgen pakketnamen een conventie. Een pakket maakt gebruik van het laatste deel van het importpad als naam. De Go-standaardbibliotheek bevat bijvoorbeeld een pakket met de naam math/cmplx
, dat nuttige code biedt voor het werken met complexe getallen. Het importpad van dit pakket is math/cmplx
en u importeert het als volgt:
import "math/cmplx"
Als u naar objecten in het pakket wilt verwijzen, gebruikt u de pakketnaam, cmplx
zoals deze:
cmplx.Inf()
Laten we een pakket maken.
Een pakket maken
Maak een nieuwe map in de map met de $GOPATH/src
naam calculator
. Maak een bestand met de naam sum.go
. De structuurmap moet er als volgt uitzien:
src/
calculator/
sum.go
Initialiseer het sum.go
bestand met de naam van het pakket:
package calculator
U kunt nu beginnen met het schrijven van de functies en variabelen voor het pakket. In tegenstelling tot andere programmeertalen biedt Go niet de public
of private
trefwoorden om aan te geven of een variabele of functie kan worden aangeroepen van buiten of binnen het pakket. Maar Go volgt twee eenvoudige regels:
- Als u iets privé wilt maken, start u de naam met een kleine letter.
- Als u iets openbaar wilt maken, start u de naam met een hoofdletter.
Laten we dus de volgende code toevoegen aan het rekenmachinepakket dat we maken:
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
}
Laten we eens kijken naar enkele dingen in die code:
- De
logMessage
variabele kan alleen vanuit het pakket worden aangeroepen. - De
Version
variabele kan vanaf elke locatie worden bereikt. U wordt aangeraden een opmerking op te nemen om het doel van deze variabele te beschrijven. (Deze beschrijving is handig voor iedereen die het pakket gebruikt.) - De
internalSum
functie kan alleen vanuit het pakket worden aangeroepen. - De
Sum
functie kan vanaf elke locatie worden bereikt. U wordt aangeraden een opmerking op te nemen om het doel van de functie te beschrijven.
Als u wilt controleren of alles werkt, kunt u de go build
opdracht uitvoeren in de calculator
map. Als u dat wel doet, ziet u dat er geen uitvoerbaar binair bestand wordt gegenereerd.
Een module maken
U hebt de rekenmachinefunctionaliteit in een pakket geplaatst. Nu is het tijd om dat pakket in een module te plaatsen. Go-modules bevatten doorgaans pakketten die gerelateerde functionaliteit bieden. De module van een pakket geeft ook de context op die Go nodig heeft om de code uit te voeren die u hebt gegroepeerd. Deze contextuele informatie bevat de Go-versie waarvoor uw code is geschreven.
Modules helpen andere ontwikkelaars ook specifieke versies van uw code te raadplegen en maken het werken met afhankelijkheden eenvoudiger. Een ander voordeel is dat de broncode van ons programma niet strikt hoeft te bestaan in de $GOPATH/src
map. Door deze beperking vrij te maken, is het handiger om tegelijkertijd met verschillende pakketversies in andere projecten te werken.
Als u dus een module voor het calculator
pakket wilt maken, voert u deze opdracht uit in de hoofdmap ($GOPATH/src/calculator
):
go mod init github.com/myuser/calculator
Nadat u deze opdracht hebt uitgevoerd, github.com/myuser/calculator
wordt de naam van de module. U gebruikt die naam om ernaar te verwijzen in andere programma's. Met de opdracht wordt ook een nieuw bestand gemaakt met de naam go.mod
. Ten slotte ziet de structuurmap er nu als volgt uit:
src/
calculator/
go.mod
sum.go
De inhoud van het go.mod
bestand moet eruitzien als de volgende code. (De Go-versie kan afwijken.)
module github.com/myuser/calculator
go 1.14
Als u wilt verwijzen naar uw calculator
pakket in andere programma's, moet u het importeren met behulp van de modulenaam. In dit geval is github.com/myuser/calculator
de naam . Laten we nu eens kijken naar een voorbeeld van het gebruik van dit pakket.
Notitie
In het verleden is het beheren van afhankelijkheden in Go niet eenvoudig geweest. Het systeem voor afhankelijkhedenbeheer is nog steeds bezig. Als u meer wilt weten over modules, raadpleegt u deze reeks berichten die zijn gepubliceerd in de Go-blog.
Verwijzen naar een lokaal pakket (een module)
Nu gaan we het pakket gebruiken. We gaan verder met de voorbeeldtoepassing die we hebben gebruikt. Deze keer gebruiken we, in plaats van de sum
functie in het main
pakket, de functie die we eerder in het calculator
pakket hebben gemaakt.
De structuur van het structuurbestand moet er nu als volgt uitzien:
src/
calculator/
go.mod
sum.go
helloworld/
main.go
We gebruiken deze code voor het $GOPATH/src/helloworld/main.go
bestand:
package main
import (
"fmt"
"github.com/myuser/calculator"
)
func main() {
total := calculator.Sum(3, 5)
fmt.Println(total)
fmt.Println("Version: ", calculator.Version)
}
U ziet dat de importinstructie gebruikmaakt van de naam van het pakket dat u hebt gemaakt: calculator
. Als u de Sum
functie vanuit dat pakket wilt aanroepen, moet u de pakketnaam opnemen, zoals in calculator.Sum
. Ten slotte hebt u nu ook toegang tot de Version
variabele. Je noemt het als volgt: calculator.Version
.
Als u het programma nu probeert uit te voeren, werkt het niet. U moet Go laten weten dat u modules gebruikt om te verwijzen naar andere pakketten. Voer hiervoor deze opdracht uit in de $GOPATH/src/helloworld
map:
go mod init helloworld
In de vorige opdracht helloworld
is dit de naam van het project. Met deze opdracht maakt u een nieuw go.mod
bestand, dus nu ziet de structuurmap er als volgt uit:
src/
calculator/
go.mod
sum.go
helloworld/
go.mod
main.go
Wanneer u het go.mod
bestand opent, ziet u ongeveer de volgende code. (De Go-versie kan afwijken.)
module helloworld
go 1.14
Omdat u verwijst naar een lokale kopie van de module, moet u Go informeren dat u geen externe locatie wilt gebruiken. U moet het go.mod
bestand dus handmatig wijzigen om de verwijzing op te nemen, zoals deze:
module helloworld
go 1.14
require github.com/myuser/calculator v0.0.0
replace github.com/myuser/calculator => ../calculator
Het replace
trefwoord geeft aan dat een lokale map moet worden gebruikt in plaats van een externe locatie voor de module. In dit geval, omdat de helloworld
en calculator
programma's zich bevinden $GOPATH/src
, is de locatie gewoon ../calculator
. Als de bron van de module zich op een andere locatie bevindt, definieert u hier het lokale pad.
Voer het programma uit met behulp van deze opdracht:
go run main.go
De uitvoer moet als volgt zijn:
8
Version: 1.0
Uitdaging 1
Wat gebeurt er als u de logMessage
variabele of de internalSum
functie probeert aan te roepen vanuit het calculator
pakket in de hoofdtoepassing? Wordt het uitgevoerd? Probeer het eens!
Oplossing voor uitdaging:
package main import ( "fmt" "github.com/myuser/calculator" ) func main() { total := calculator.internalSum(5) fmt.Println(total) fmt.Println("Version: ", calculator.logMessage) }
Een pakket publiceren
Het publiceren van een Go-pakket is vrij eenvoudig. U hoeft alleen de broncode van het pakket openbaar beschikbaar te maken. De meeste ontwikkelaars gebruiken GitHub om pakketten beschikbaar te maken voor het publiek. Daarom vindt u soms verwijzingen naar github.com
in importinstructies.
Als u uw pakket bijvoorbeeld wilt publiceren calculator
naar uw GitHub-account, moet u een opslagplaats met de naam calculator
maken. De URL moet er ongeveer als volgt uitzien:
https://github.com/myuser/calculator
U gaat uw pakketten versien door uw opslagplaats te taggen, zoals hieronder:
git tag v0.1.0
git push origin v0.1.0
Ontwikkelaars die uw pakket (inclusief u) willen gebruiken, verwijzen er als volgt naar:
import "github.com/myuser/calculator"
Laten we eens nader ingaan op het verwijzen naar pakketten van derden.
Externe (externe) pakketten verwijzen
Soms moeten uw programma's verwijzen naar pakketten die zijn geschreven door andere ontwikkelaars. Deze pakketten zijn doorgaans beschikbaar op GitHub. De volgende instructies voor het verwijzen naar pakketten van derden werken of u een pakket ontwikkelt (een ander pakket dan main
) of een zelfstandig programma (het main
pakket).
Laten we een verwijzing naar het rsc.io/quote
pakket toevoegen:
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())
}
Als u Visual Studio Code gebruikt, wordt het go.mod
bestand bijgewerkt wanneer u het bestand opslaat. Het ziet er nu als volgt uit:
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
U ziet hoe rsc.io/quote
verwijst naar een specifieke versie van het pakket. Wanneer u de afhankelijkheden van uw programma moet upgraden, moet u hier de versie wijzigen.
Voer het programma opnieuw uit met behulp van deze opdracht:
go run main.go
De uitvoer moet er ongeveer als volgt uitzien:
8
Version: 1.0
Hello, world.
Alle toekomstige verwijzingen naar pakketten van derden moeten in het go.mod
bestand staan. Wanneer u de toepassing uitvoert of compileert, downloadt Go alle bijbehorende afhankelijkheden.