Programowanie w Go - #16 Packages, dzielimy nasz program na pakiety
Przez cały okres trwania kursu zaniedbaliśmy pewien temat, więc czas to teraz nadrobić. W tej części kursu programowania w Go nauczymy się dzielić program na mniejsze kawałki (tzw. packages), czasem można je nazywać modułami lub tego typu określeniami. Zatem, zajmiemy się logiczną organizacją naszego programu, aby łatwiej było go tworzyć, rozwijać, a innym developerom czytać. Jeżeli analizowaście programy w Go, to na pewno zauważyliście, że mają one wiele plików z kodem *.go
, a nie tylko jeden.
Pakiety, nazwy, eksportowanie i aliasy
Wstęp
Jak możemy wyczytać w golang spec, programy w Go są skonstruowane poprzez połączenie razem pakietów/paczek (packages). Sam pakiet z kolei, jest utworzony z jednego lub więcej plików z kodem źródłowym, które deklarują stałe, typy, zmienne i funkcje, które przynależą do paczki i są dostępne we wszystkich plikach należących do tej samej paczki.
Na filmie tym razem pokażę Wam pisanie od podstaw bardzo prostego przykładowego modułu oraz wyjaśnię jakie mamy możliwości w dostępie do takiego modułu. Zrobię też “podmoduł” z jednym zagnieżdżeniem, aby pokazać, jak wtedy można sobie radzić z używaniem takiego. W trakcie analizy kodu źródłowego, polecam zwrócić uwagę na następujące kwestie:
- ścieżkę do pliku z modułem (wraz z katalogiem)
- nazwą, która pojawia się na początku pliku po słowie kluczowym
package
- sposobie, w jaki korzystamy z danego modułu, w moim przykładzie dzieje się to w pliku
main.go
Film z tematyki pakiety, nazwy, eksportowanie i aliasy
Pliki
Poniższe pliki zostały użyte w przykładzie z filmu:
main.go
1package main
2
3import (
4 "devopsiarz/client"
5 "devopsiarz/client/http"
6 devops "devopsiarz/server"
7 "fmt"
8)
9
10func main() {
11 // from package server
12 srv := devops.MyServer{}
13 srv.Address = "localhost:8080"
14 srv.Config = "v1.0"
15 fmt.Println(srv)
16 fmt.Println(".")
17
18 // from package client/http
19 c1 := http.Client{}
20 c1.ClientConfig = "something"
21
22 // from package client/http
23 c2 := http.Client2{}
24 c2.Config = "config2"
25
26 // from package client
27 var smallClient client.SmallClient
28 smallClient = "test smallClient"
29 fmt.Println(smallClient)
30}
server/myserver.go
1package server
2
3import "fmt"
4
5type MyServer struct {
6 Address string
7 Config string
8}
9
10func init() {
11 fmt.Println("server init() called.")
12}
client/smallclient.go
1package client
2
3// this is exported
4type SmallClient string
client/http/client.go
1package http
2
3type Client struct {
4 ClientConfig string
5}
6
7type Client2 struct {
8 Config string
9}