Gestione Package
Creazione di un Package
Decisioni:
- il repository di appoggio sarà
masha.kan
- L'autore sarà
mich
- Il package (artefatto) sarà
customer
Preparazione delle directory:
cd $GOPATH/src
mkdir -p masha.kan/mich/customer
Redazione del programma per il package:
cd masha.kan/mich/customer
vi customer.go
(customer.go):
package customer
import "fmt"
// Tutte le struct e i loro metodi sono in questo package
// I nomi con iniziale maiuscola sono esportati
type Address struct {
Street, City, State, Zip string
IsShippingAddress bool
}
type Customer struct {
FirstName, LastName, Email, Phone string
Addresses []Address
}
func (c Customer) ToString() string {
return fmt.Sprintf("Customer: %s %s, Email:%s",
c.FirstName, c.LastName, c.Email)
}
func (c Customer) ShippingAddress() string {
for _, v := range c.Addresses {
if v.IsShippingAddress == true {
return fmt.Sprintf("%s, %s, %s, Zip -%s",
v.Street, v.City, v.State, v.Zip)
}
}
return ""
}
func Getcustomer() Customer {
// In realtà sarebbe ottenuto da un DB
c := Customer{
FirstName: "Alex",
LastName: "John",
Email: "alex@email.com",
Phone: "732-757-2923",
Addresses: []Address{
Address{
Street: "1 Mission Street",
City: "San Francisco",
State: "CA",
Zip: "94105",
IsShippingAddress: true,
},
Address{
Street: "49 Stevenson Street",
City: "San Francisco",
State: "CA",
Zip: "94105",
},
},
}
return c
}
L'albero al di sotto del workspace è al momento:
.
├── bin
└── src
└── masha.kan
└── mich
└── customer
└── customer.go
Andare nella directory customer
.
Installare il package:
go install
L'albero al di sotto del workspace è diventato:
.
├── bin
├── pkg
│ └── linux_amd64
│ └── masha.kan
│ └── mich
│ └── customer.a
└── src
└── masha.kan
└── mich
└── customer
└── customer.go
Notare che pkg
è stato creato perchè ancora non esisteva, e che al di sotto ha una directory che specifica l'architettura.
Essendo i package delle librerie statiche, composte di moduli oggetto, sono dipendenti dall'architettura per cui sono state prodotte.
E' possibile in Go la cross-compilazione, ovvero la produzione di oggetti ed eseguibili destinati ad architetture diverse da quella della piattaforma di sviluppo.
Creazione di un programma che usa il package
Decisioni:
- Sarà nella directory sorgente
masha.kan/mich/cust
e questo saraà anche automaticamente il nome dell'eseguibile - Il file sorgente si chiamerà
listcust.go
Notare che il fatto che un eseguibile o un package si chiami come la directory che lo contiene, ci permette di suddividerlo
in molti file con nomi diversi, e il build saprà come fare.
Naturalmente tutti i file devono appartenere allo stesso package, qui main
, e nel nostro caso ci deve essere una sola func main()
.
Quindi creare la directory, andarvi dentro ed editare il programma:
cd $GOPATH
mkdir -p src/masha.kan/mich/cust
cd src/masha.kan/mich/cust
vi listcust.go
(listcust.go):
package main
import "fmt"
// cus è un alias a customer
import cus "masha.kan/mich/customer"
func main() {
c := cus.Getcustomer()
fmt.Println(c.ToString())
fmt.Println(c.ShippingAddress())
}
Provarlo con:
go run listcust.go
Compilarlo a eseguibile locale:
go build
Provarlo da eseguibile:
./cust
Per installarlo:
go install
L'albero sotto il workspace è diventato:
.
├── bin
│ └── cust
├── pkg
│ └── linux_amd64
│ └── masha.kan
│ └── mich
│ └── customer.a
└── src
└── masha.kan
└── mich
├── cust
│ └── listcust.go
└── customer
└── customer.go
Ora possiamo eseguirlo da ovunque nel filestore semplicemente col comando cust
non qualificato.