Structuri
Structurile reprezintă un tip de date definit de dezvoltator, folosit pentru a reprezenta anumite obiecte. Structurile conțin un set de câmpuri care reprezintă diferite atribute ale obiectului. Pentru a defini o structură, se utilizează cuvintele cheie type și struct:
type nume_structură struct{
câmpuri_structură
}
Fiecare câmp are un nume și un tip de date, la fel ca o variabilă. De exemplu, să definim o structură care reprezintă o persoană:
type person struct{
name string
age int
}
Structura se numește person. Ea are două câmpuri: name (numele persoanei, de tip string) și age (vârsta persoanei, de tip int).
Crearea și inițializarea unei structuri
Structura reprezintă un tip nou de date, iar noi putem defini o variabilă de acest tip:
var tom person
Cu ajutorul unui inițializator, putem transmite valorile inițiale structurii:
var tom person = person{"Tom", 23}
Inițializatorul reprezintă un set de valori plasate între paranteze acolade. Aceste valori sunt transmise câmpurilor structurii în ordinea în care câmpurile sunt definite în structură. De exemplu, în acest caz, șirul "Tom" este transmis primului câmp — name, iar al doilea valoare — 23, este transmis celui de-al doilea câmp — age.
De asemenea, putem specifica în mod explicit ce valori sunt transmise fiecărui câmp:
var alice person = person{age: 23, name: "Alice"}
De asemenea, există modalități prescurtate de a inițializa o variabilă structură:
var tom = person {name: "Tom", age: 24}
bob := person {name: "Bob", age: 31}
Putem chiar să nu specificăm nicio valoare, caz în care câmpurile structurii vor primi valorile implicite:
undefined := person {} // name - șir gol, age - 0
Accesul la câmpurile structurii
Pentru a accesa câmpurile unei structuri, după variabilă se pune punctul și se specifică câmpul structurii:
package main
import "fmt"
type person struct{
name string
age int
}
func main() {
var tom = person {name: "Tom", age: 24}
fmt.Println(tom.name) // Tom
fmt.Println(tom.age) // 24
tom.age = 38 // modificăm valoarea
fmt.Println(tom.name, tom.age) // Tom 38
}
Poințatoare către structuri
La fel ca și în cazul variabilelor obișnuite, putem crea pointere către structuri.
package main
import "fmt"
type person struct{
name string
age int
}
func main() {
tom := person {name: "Tom", age: 22}
var tomPointer *person = &tom
tomPointer.age = 29
fmt.Println(tom.age) // 29
(*tomPointer).age = 32
fmt.Println(tom.age) // 32
}
Pentru a inițializa un pointer către o structură, nu este necesar să-i atribuim adresa unei variabile. Putem atribui adresa unui obiect anonim astfel:
var tom *person = &person{name:"Tom", age:23}
var bob *person = new(person)
Pentru a accesa câmpurile unei structuri prin pointer, putem utiliza operația de dereferențiere ((*tomPointer).age), sau putem accesa direct prin pointer (tomPointer.age).
De asemenea, putem defini pointere către câmpuri individuale ale unei structuri:
tom := person {name: "Tom", age: 22}
var agePointer *int = &tom.age // pointer către câmpul tom.age
*agePointer = 35 // modificăm valoarea câmpului
fmt.Println(tom.age) // 35