Usare le struct in Go
Qui abbiamo visto come creare dei tipi custom in Go, ma non abbiamo approfondito il discorso sulle struct.
In questo articolo vediamo un uso più avanzato facendo un pò di esempi.
Cominciamo da un esempio basico:
package main
import "fmt"
type libro struct {
titolo string
prezzo float32
info info
}
func main() {
// MODO 1
l1 := libro{titolo: "IT", prezzo: 100.32}
fmt.Println(l1.titolo, l1.prezzo)
// // MODO 2
var l2 libro
l2.titolo = "Odissea"
fmt.Println(l2)
l2.titolo = "Sahara"
fmt.Println(l2)
}
Come vedete abbiamo due modi per inizializzare una struct.
Nel primo caso passiamo i valori in fase di definizione.
Nel secondo caso sarà inizialmente vuota, e poi andiamo ad impostare dei valori.
Volendo possiamo anche "embeddare" una struct dentro un'altra.
Supponiamo di voler aggiungere dei dati alla struct principale:
package main
import "fmt"
type libro struct {
titolo string
prezzo float32
info
}
type info struct {
isbn string
note string
}
func main() {
l := libro{
titolo: "IT",
prezzo: 10.56,
info: info{
isbn: "5699956565",
note: "note varie",
},
}
fmt.Println(l)
}
Se vedete assomiglia molto ad un oggetto JSON.
Supponiamo adesso di voler creare una funziona apposita che fa la stampa in console, usando un receiver:
package main
import "fmt"
type libro struct {
titolo string
prezzo float32
info
}
type info struct {
isbn string
note string
}
func main() {
l := libro{
titolo: "IT",
prezzo: 10.56,
info: info{
isbn: "5699956565",
note: "note varie",
},
}
l.print()
}
func (l libro) print() {
fmt.Println(l)
}
E' un esempio banale ovviamente, ma può risultare utile in altri frangenti.
L'ultimo esempio prevede l'uso dei puntatori per aggiornare un valore.
Allora, Go è un linguaggio "pass-by-value", il che significa che di default non va a modificare l'oggetto corrente, ma ne crea una copia.
Quindi non possiamo semplicemente fare l'update, ma dobbiamo usare un puntatore:
package main
import "fmt"
type libro struct {
titolo string
prezzo float32
info
}
type info struct {
isbn string
note string
}
func main() {
l := libro{
titolo: "IT",
prezzo: 10.56,
info: info{
isbn: "5699956565",
note: "note varie",
},
}
l.upPrezzo(23.00)
l.print()
}
func (lp *libro) upPrezzo(newPrezzo float32) {
(*lp).prezzo = newPrezzo
}
func (l libro) print() {
fmt.Println(l)
}
Rispetto ad altri linguaggi, il suo utilizzo è un pò più semplice.
Enjoy!
go struct receiver
Commentami!