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à.