Usare le struct in Go

Mattepuffo's logo
Usare le struct in Go

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!


Condividi

Commentami!