Structs

Oltre ai tipi semplici predefiniti da Go è possibile aggiungere ai programmi altri tipi dati.

I tipi dati composti principali sono le struct.

La loro struttura interna è molto simile a quella del linguaggio C. Sono una lista di campi ciascuno col nome e tipo.

Va prima dichiarato il tipo, poi le variabili che sono di questo tipo. L'accesso ai campi della struct è tramite l'operatore punto.

type nome struct {
    nome1 tipo
    nome2 tipo
    ...
}
...
var1 := nome
...
var1.nome1 = valore
...

Una struct è allocata staticamente in memoria, nello stack, e può essere usata per valore o per riferimento, cioè è possibile avere puntatori ad una struct.

Esempio

(180structs.go):

package main

import "fmt"

// Una struct è un nuovo tipo composto da
// campi interni ciacuno con un tipo proprio
// Le struct devono venire dichiarati prima dell'uso
type person struct {
	name string
	age  int
}

func main() {

	// Creazione di una variabile di tipo person
	// I parametri sono nell'ordine di definizione
	p := person{"John", 42}
	fmt.Println(p)

	// Uso immediato di un person anonimo
	fmt.Println(person{"Bob", 20})

	// Si possono inizializzare i campi col nome
	// anche in un ordine diverso
	fmt.Println(person{age: 30, name: "Alice"})

	// I campi omessi valgono zero
	fmt.Println(person{name: "Fred"})

	// Accesso ai singoli campi con l'operatore punto
	s := person{name: "Sean", age: 50}
	fmt.Println(s.name)

	// Anche tramite puntatore si usa l'operatore punto
	// sp è un puntatore a s
	sp := &s
	// Accesso alcampo age; in C era sp->age
	fmt.Println(sp.age)

	// Assegnazione di un valoread un campo
	// Le struct sono mutevoli
	sp.age = 51
	fmt.Println(sp.age)

	// Uno `&` prefisso ritorna un puntatore alla struct
	a := &person{name: "Ann", age: 40}
	// a viene automaticamente dereferenziato (<> C)
	// ma viene indicato che è un indirizzo
	fmt.Println("a: ", a)
	// Per stampare l'indirizzo di a (<> C)
	fmt.Println("addr(a): ", &a)
}

Le struct sono l'equivalente dei record in altri linguaggi di programmazione.

In Go non esistono classi, ma una struct si può considerare come la parte di una classe che contiene gli attributi. I suoi metodi sono dichiarati fuori dalla struct.

Non esiste ereditarietà.