Szukaj…
Inicjalizacja pakietu
Pakiet może mieć metody init
, które są uruchamiane tylko raz przed main.
package usefull
func init() {
// init code
}
Jeśli chcesz uruchomić inicjalizację pakietu bez odwoływania się do czegokolwiek, użyj następującego wyrażenia importu.
import _ "usefull"
Zarządzanie zależnościami pakietów
Częstym sposobem pobierania zależności Go jest użycie komendy go get <package>
, która zapisze pakiet w globalnym / udostępnionym $GOPATH/src
. Oznacza to, że jedna wersja każdego pakietu zostanie połączona z każdym projektem, który uwzględnia go jako zależność. Oznacza to również, że gdy nowy deweloperzy wdraża projekt, będą go get
najnowszą wersję każdego uzależnienia.
Można jednak zachować spójność środowiska kompilacji, dołączając wszystkie zależności projektu do katalogu vendor/
. Zachowanie zgodności dostarczonych zależności wraz z repozytorium projektu umożliwia wykonanie wersjonowania zależności dla poszczególnych projektów i zapewnia spójne środowisko dla kompilacji.
Tak będzie wyglądać struktura twojego projektu:
$GOPATH/src/
├── github.com/username/project/
| ├── main.go
| ├── vendor/
| | ├── github.com/pkg/errors
| | ├── github.com/gorilla/mux
Używanie innej nazwy pakietu i folderu
Można używać nazwy pakietu innej niż nazwa folderu. Jeśli to zrobimy, nadal musimy zaimportować pakiet na podstawie struktury katalogów, ale po zaimportowaniu musimy się do niego odwołać przy użyciu nazwy użytej w klauzuli pakietu.
Na przykład, jeśli masz folder $GOPATH/src/mypck
, a w nim mamy plik a.go
:
package apple
const Pi = 3.14
Korzystanie z tego pakietu:
package main
import (
"mypck"
"fmt"
)
func main() {
fmt.Println(apple.Pi)
}
Nawet jeśli to działa, powinieneś mieć dobry powód, aby oddzielić nazwę pakietu od nazwy folderu (może to być przyczyną nieporozumień i zamieszania).
Jaki jest pożytek z tego?
Prosty. Nazwa pakietu to identyfikator Go:
identifier = letter { letter | unicode_digit } .
Dzięki temu w identyfikatorach można stosować litery Unicode, np. αβ
jest prawidłowym identyfikatorem w Go. Nazwy folderów i plików nie są obsługiwane przez Go, ale przez system operacyjny, a różne systemy plików mają różne ograniczenia. W rzeczywistości istnieje wiele systemów plików, które nie zezwalają na wszystkie prawidłowe identyfikatory Go jako nazwy folderów, więc nie można nazwać swoich pakietów, co inaczej pozwoliłaby specyfikacja języka.
Mając opcję używania innych nazw pakietów niż ich foldery, możesz naprawdę nazwać swoje pakiety, na co pozwala specyfikacja języka, niezależnie od systemu operacyjnego i systemu plików.
Importowanie paczek
Możesz zaimportować pojedynczy pakiet z instrukcją:
import "path/to/package"
lub grupuj wiele importów razem:
import (
"path/to/package1"
"path/to/package2"
)
Spowoduje to wyszukanie odpowiednich ścieżek import
wewnątrz $GOPATH
dla plików .go
i umożliwi dostęp do wyeksportowanych nazw za pośrednictwem packagename.AnyExportedName
.
Możesz również uzyskać dostęp do lokalnych pakietów w bieżącym folderze, zastępując je pakietami ./
. W projekcie o takiej strukturze:
project
├── src
│ ├── package1
│ │ └── file1.go
│ └── package2
│ └── file2.go
└── main.go
Możesz to wywołać w main.go
, aby zaimportować kod do file1.go
i file2.go
:
import (
"./src/package1"
"./src/package2"
)
Ponieważ nazwy pakietów mogą kolidować w różnych bibliotekach, możesz chcieć aliasować jeden pakiet do nowej nazwy. Możesz to zrobić, poprzedzając wyciąg z importu nazwą, której chcesz użyć.
import (
"fmt" //fmt from the standardlibrary
tfmt "some/thirdparty/fmt" //fmt from some other library
)
Umożliwia to dostęp do poprzedniego pakietu fmt
przy użyciu fmt.*
A drugiego pakietu fmt
przy użyciu tfmt.*
.
Możesz także zaimportować pakiet do własnej przestrzeni nazw, aby móc odwoływać się do eksportowanych nazw bez package.
prefiks używający pojedynczej kropki jako aliasu:
import (
. "fmt"
)
Powyższy przykład importuje fmt
do globalnej przestrzeni nazw i pozwala na wywołanie na przykład Printf
bezpośrednio: Plac zabaw
Jeśli zaimportujesz pakiet, ale nie użyjesz żadnej z jego eksportowanych nazw, kompilator Go wydrukuje komunikat o błędzie. Aby to obejść, możesz ustawić alias na podkreślenie:
import (
_ "fmt"
)
Może to być przydatne, jeśli nie masz bezpośredniego dostępu do tego pakietu, ale potrzebujesz jego funkcji init
do uruchomienia.
Uwaga:
Ponieważ nazwy pakietów są oparte na strukturze folderów, wszelkie zmiany w nazwach folderów i odwołaniach do importu (w tym rozróżnianie wielkości liter) spowodują błąd czasu kompilacji „kolizyjny import bez rozróżniania wielkości liter” w systemie Linux i OS-X, który jest trudny do prześledzenia i naprawić (komunikat o błędzie jest trochę tajemniczy dla zwykłych śmiertelników, ponieważ próbuje przekazać coś przeciwnego - porównanie nie powiodło się z powodu rozróżnienia wielkości liter).
np .: „ścieżka / do / pakiet 1” vs „ścieżka / do / pakiet 1”
Przykład na żywo: https://github.com/akamai-open/AkamaiOPEN-edgegrid-golang/issues/2