Go non consente di definire le classi ma consente di definire dei metodi disponibili per una struttura.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
package main import "fmt" //Persona - commento type Persona struct { nome string cognome string } func (p Persona) iniziali() { fmt.Println(p.nome[0:1] + p.cognome[0:1]) } func main() { var io = Persona{"Valerio", "Finazzo"} io.iniziali() } |
Nel blocco sopra ho definito una struttura Persona che contiene nome e cognome. Per definire un metodo si usa una sintassi simile alla definizione di una funzione. Si usa la parola chiave func, definita dalla struttura cui si applica, il nome del metodo, la lista dei parametri che riceve in ingresso e l’eventuale output. Nello specifico ho definito un metodo iniziali che stampa le iniziali della persona.
Nell’esempio di sopra il metodo definito sfrutta il passaggio per valore, ovvero il metodo opera su una copia della struttura persona senza modificare i valori dell’istanza di partenza. Per ovviare a questo Go mette a disposizione il passaggio per riferimento, che si ottiene specificando il puntatore alla struttura.
1 2 3 4 5 6 7 |
func (p *Persona) inverti() { var nome, cognome string nome = p.nome cognome = p.cognome p.cognome = nome p.nome = cognome } |
Con questo approccio invocando il metodo iniziali si avrà l’effetto desiderato. In assenza del puntatore non si avrebbe l’effetto atteso.
1 2 3 4 5 6 |
func main() { var io = Persona{"Valerio", "Finazzo"} io.iniziali() io.inverti() io.iniziali() } |
Go mette a disposizione anche il costrutto interfaccia, ovvero permette di definire una lista di metodi che le strutture devono implementare
1 2 3 4 |
//Familiare - commento type Familiare interface { iniziali() } |
In questo caso ho definito una interfaccia Familiare che prevede il metodo iniziali, pertanto posso invocare il metodo iniziali su una variabile che implementa l’interfaccia Familiare
1 2 |
var nuovoio Familiare = Persona{"Valerio", "Finazzo"} nuovoio.iniziali() |