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}